Java 高级—— IO 基础

一、File 类

先看一下File 类的定义

[java] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. public class File extends Object implements Serizliable Comparable<File>  

从定义看,File类是Object的直接子类,同时它继承了Comparable接口可以进行数组的排序。

File类的操作包括文件的创建、删除、重命名、得到路径、创建时间等,以下是文件操作常用的函数。


File类的操作:

1、创建文件,注意File.separator可以解决跨操作系统的问题。

下面的例子是一创建一个文件,如果该文件存在则删除,否则创建该文件。

[java] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. package cn.com.qiang.FiloDemo;  
  2.   
  3. import java.io.File;  
  4. import java.io.IOException;  
  5.   
  6. public class FileDemo2 {  
  7.     public static void main(String[] args) {  
  8.         File file = new File("D:\\test.txt");  
  9.         if(file.exists()){  
  10.             file.delete();  
  11.         }else{  
  12.             try{  
  13.                 file.createNewFile();  
  14.             }catch (IOException e){  
  15.                 e.printStackTrace();  
  16.             }  
  17.         }  
  18.     }  
  19. }  

 

2、文件的类型函数

       file.isFile(); //判断是不是文件

       file.isDirectory();//判断是不是目录

 

3、列出目录的内容

        pulbic String[] list();//列出所有文件名和目录名

        public File[] listFiles();//列出所有文件和目录

 

二、IO 流

        与 C 一样,Java 也有流这个概念,下面先回忆一下什么是流

1、什么是流

      流(stream)的概念源于UNIX中管道(pipe)的概念。在UNIX中,管道是一条不间断的字节流,用来实现程序或进程间的通信,或读写外围设备、外部文件等。

      一个流,必有源端和目的端,它们可以是计算机内存的某些区域,也可以是磁盘文件,甚至可以是Internet上的某个URL。

      流的方向是重要的,根据流的方向,流可分为两类:输入流和输出流。用户可以从输入流中读取信息,但不能写它。相反,对输出流,只能往输入流写,而不能读它。

      实际上,流的源端和目的端可简单地看成是字节的生产者和消费者,对输入流,可不必关心它的源端是什么,只要简单地从流中读数据,而对输出流,也可不知道它的目的端,只是简单地往流中写数据。

      形象的比喻——水流 ,文件======程序 ,文件和程序之间连接一个管道,水流就在之间形成了,自然也就出现了方向:可以流进,也可以流出.便于理解,这么定义流: 流就是一个管道里面有流水,这个管道连接了文件和程序。

 

2、流的分类

1)、Java.io包中的类对应两类流,一类流直接从指定的位置(如磁盘文件或内存区域)读或写,这类流称为结点流(node stream),其它的流则称为过滤器(filters)。过滤器输入流往往是以其它输入流作为它的输入源,经过过滤或处理后再以新的输入流的形式提供给用户,过滤器输出流的原理也类似。

2)、Java的常用输入、输出流
java.io包中的stream类根据它们操作对象的类型是字符还是字节可分为两大类: 字符流和字节流。
 
•Java的字节流

InputStream是所有字节输入流的祖先,而OutputStream是所有字节输出流的祖先。

•Java的字符流

Reader是所有读取字符串输入流的祖先,而writer是所有输出字符串的祖先。
结合开始所说的输入/输出流 ,出现了个一小框架。 

 

                      字节流                          字符流
输入流        InputStream                  Reader
输出流        OutputStream                Writer

 

下面分别对这两种流进行介绍

JAVA字节流

 


 

•FileInputStream和FileOutputStream

这两个类属于结点流,第一个类的源端和第二个类的目的端都是磁盘文件,它们的构造方法允许通过文件的路径名来构造相应的流。如:

FileInputStream infile = new FileInputStream("myfile.dat");
FileOutputStream outfile = new FileOutputStream("results.dat");

要注意的是,构造FileInputStream, 对应的文件必须存在并且是可读的,而构造FileOutputStream时,如输出文件已存在,则必须是可覆盖的。

 

•BufferedInputStream和BufferedOutputStream

它们是过滤器流,其作用是提高输入输出的效率。 

 

•DataInputStream和DataOutputStream

这两个类创建的对象分别被称为数据输入流和数据输出流。这是很有用的两个流,它们允许程序按与机器无关的风格读写Java数据。所以比较适合于网络上的数据传输。这两个流也是过滤器流,常以其它流如InputStream或OutputStream作为它们的输入或输出。

 

下面举个例子,实现文件的复制功能:

[java] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. package cn.com.farsight.writedemo;  
  2.   
  3. import java.io.BufferedInputStream;  
  4. import java.io.BufferedOutputStream;  
  5. import java.io.FileInputStream;  
  6. import java.io.FileOutputStream;  
  7. import java.io.IOException;  
  8. import java.util.Date;  
  9.   
  10. public class InputStremdemo {  
  11.     public static void main(String[] args) throws IOException {  
  12.         FileInputStream fis = new FileInputStream("D:\\feiq.rar");  
  13.         FileOutputStream fos = new FileOutputStream("C:\\feiq.rar");  
  14.           
  15.         BufferedInputStream bfis = new BufferedInputStream(fis);  
  16.         BufferedOutputStream bfos = new BufferedOutputStream(fos);  
  17.           
  18.         System.out.println(new Date());  
  19.         int i = 0;  
  20. //      byte [] buf = new byte[128];  
  21.         while((i = bfis.read())!=-1){  
  22.             bfos.write(i);  
  23.         }  
  24.           
  25.         fis.close();  
  26.         fos.close();  
  27.         bfis.close();  
  28.         bfos.close();  
  29.           
  30.         System.out.println(new Date());  
  31.     }  
  32. }  

执行结果如下:

[java] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. Tue Jan 26 20:24:50 CST 2016  
  2. Tue Jan 26 20:24:50 CST 2016  

文件只有600多K,速度还是挺快的。

 

Java的字符流

    字符流主要是用来处理字符的。Java采用16位的Unicode来表示字符串和字符,对应的字符流按输入和输出分别称为readerwriter

 

•InputStreamReader和OutputStreamWriter

在构造这两个类对应的流时,它们会自动进行转换,将平台缺省的编码集编码的字节转换为Unicode字符。对英语环境,其缺省的编码集一般为ISO8859-1。

•BufferedReader和BufferedWriter

这两个类对应的流使用了缓冲,能大大提高输入输出的效率。这两个也是过滤器流,常用来对InputStreamReader和OutputStreamWriter进行处理。

FileReader 和FileWriter

1、FileWriter类

构造方法:

[java] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. FileWriter fw = new FileWriter(String fileName);//创建字符输出流类对象和已存在的文件相关联。文件不存在的话,并创建。  
  2.   
  3. 如:FileWriter fw = new FileWriter("C:\\demo.txt");  

主要方法: void write(String str)   // 写入字符串。当执行完此方法后,字符数据还并没有写入到目的文件中去。此时字符数据会保存在缓冲区中。

                                                                此时在使用刷新方法就可以使数据保存到目的文件中去。

                     void flush()                   // 刷新该流中的缓冲。将缓冲区中的字符数据保存到目的文件中去。

                     void close()                  // 关闭此流。在关闭前会先刷新此流的缓冲区。在关闭后,再写入或者刷新的话,会抛IOException异常。


2、FileReader类

构造方法

[java] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. FileReader fr = new FileReader(String fileName);//使用带有指定文件的String参数的构造方法。创建该输入流对象。并关联源文件。  

主要方法
int read(char []cbuf);//将字符读入数组。返回读取的字符数。如果已经到达尾部,则返回-1。

void close();              //关闭此流对象。释放与之关联的所有资源。

 

下面是个例子

[java] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. package cn.com.qiang.FiloDemo;  
  2.   
  3. import java.io.BufferedReader;  
  4. import java.io.File;  
  5. import java.io.FileReader;  
  6. import java.io.PrintWriter;  
  7.   
  8. public class FiloDemo3 {  
  9.   
  10.     public static void main(String[] args){  
  11.   
  12.         File fin,fout;    
  13.         BufferedReader bf = null;  
  14.         PrintWriter pw = null;  
  15.         try{  
  16.             fin = new File("D:\\面向对象面向过程.txt"); //注意文件与程序都要在同一个文件夹下。zzc.txt为要被复制的文件。  
  17.             fout = new File("D:\\copy面向对象面向过程.txt"); //如果没有会自动创建。  
  18.             bf = new BufferedReader(new FileReader(fin));  
  19.             pw = new PrintWriter(fout); //PrintWriter为打印流,也可以使用BufferedWriter.  
  20.             String line = bf.readLine();  
  21.           
  22.             while(line!=null){  
  23.                 pw.println(line);  
  24.                 line = bf.readLine();  
  25.             }  
  26.         }catch(Exception e){  
  27.             e.printStackTrace();  
  28.         }finally{  
  29.             try{  
  30.         //关闭 文件。  
  31.                 if(bf!=null){  
  32.                     bf.close();  
  33.                     bf = null;  
  34.                 }  
  35.                 if(pw!=null){  
  36.                     pw.close();  
  37.                     pw = null;  
  38.                 }  
  39.             }catch(Exception e){  
  40.                 e.printStackTrace();  
  41.             }  
  42.         }  
  43.     }  
  44. }  

 

附:字节流和字符流的区别(重点)

字节流没有缓冲区,是直接输出的,而字符流是输出到缓冲区的。因此在输出时,字节流不调用colse()方法时,信息已经输出了,而字符流只有在调用close()方法关闭缓冲区时,信息才输出。要想字符流在未关闭时输出信息,则需要手动调用flush()方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/401978.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安装 SharePoint 2013 Foundation

一、Foundation版本的区别Foundation版本的区别见附件&#xff08;英文&#xff09;。官网下载地址 http://www.microsoft.com/zh-cn/download/details.aspx?id35488二、安装必备软件三、独立安装模式1. 启动安装向导2. 接受软件许可条款3. 选择服务器类型和数据位置4. 结束安…

Java 异常处理机制

异常处理是程序设计中一个非常重要的方面&#xff0c;也是程序设计的一大难点&#xff0c;从C开始&#xff0c;你也许已经知道如何用if...else...来控制异常了&#xff0c;也许是自发的&#xff0c;然而这种控制异常痛苦&#xff0c;同一个异常或者错误如果多个地方出现&#x…

架构师未来性的基础:简单性

作者&#xff1a;高焕堂&#xff0c;misoo.twqq.com 首页&#xff1a;Backee e架构师未来性的基础&#xff1a;简单性 Apple公司创始人乔布斯(Steve Jobs)曾说到&#xff1a;“简单比复杂更难&#xff0c;你必须努力让你的想法变得清晰…

Android 基础—— 对Context的理解与使用技巧

一、Context 基础概念 1、什么是Context 1) Context是一个抽象类&#xff0c;其通用实现在ContextImpl类中。 2) Context&#xff1a;是一个访问application环境全局信息的接口&#xff0c;通过它可以访问application的资源和相关的类&#xff0c;其主要功能如下&a…

Android 四大组件 —— 广播(广播机制解析)

在网络通信中&#xff0c;一个IP网络范围中最大的IP 地址是被保留作为广播地址来使用的。比如某个网络的IP 范围是192.168.0.XXX&#xff0c;子网掩码是255.255.255.0&#xff0c;那么这个网络的广播地址就是192.168.0.255。广播数据包会被发送到同一网络上的所有端口&#xff…

Android 基础 —— 活动的生存周期

一、返回栈 Android 中的活动是可以层叠的。我们每启动一个新的活动&#xff0c;就会覆盖在原活动之上&#xff0c;然后点击Back 键会销毁最上面的活动&#xff0c;下面的一个活动就会重新显示出来。 其实Android 是使用任务&#xff08;Task&#xff09;来管理活动的&#xff…

产品经理做市场调研和数据分析的方法

产品经理&#xff0c;你对用户的需求了解多少呢&#xff1f;你知道用户想要什么样的产品吗&#xff1f;你想知道用户将会如何看待你的产品吗&#xff1f;你想知道你设计的产品在用户中的口碑如何吗&#xff1f; 是 的。每一个产品经理都希望在产品开始立项设计前&#xff0c;得…

Android 基础 —— 活动的启动模式

活动的启动模式来说应该是个全新的概念&#xff0c;在实际项目中我们应该根据特定的需求为每个活动指定恰当的启动模式。启动模式一共有四种&#xff0c;分别是standard、singleTop、singleTask 和singleInstance &#xff0c; 可以在AndroidManifest.xml 中通过给<activity…

Android 四大组件 —— 服务

一、服务是什么 服务&#xff08;Service&#xff09;是Android 中实现程序后台运行的解决方案&#xff0c;它非常适合用于去执行那些不需要和用户交互而且还要求长期运行的任务。服务的运行不依赖于任何用户界面&#xff0c;即使当程序被切换到后台&#xff0c;或者用户打开了…

Highlighting System

Highlighting System 法线贴图漫反射着色器 Unity论坛&#xff1a;http://forum.unity3d.com/threads/143043-Highlighting-System-Released 需要条件 Requires Unity 3.5.6 or higher.This package requires Unity Pro, as it uses post-processing!Now supports Unity iOS Pr…

Android 基础 —— 模拟实现拨打电话功能

前面已经学习活动的显示跳转及隐式跳转&#xff0c;也学习 TextView 及 Button 两个控件的使用&#xff0c;下面我们来学习 EditText的使用&#xff1a; EditText 是程序用于和用户进行交互的另一个重要控件&#xff0c;它允许用户在控件里输入和编辑内容&#xff0c;并可以在程…

Android 四大组件 —— 活动(活动的隐式跳转)

上一篇我们讨论了活动的显示跳转&#xff0c;现在来学习活动的隐式跳转 相比于显式Intent&#xff0c;隐式Intent 则含蓄了许多&#xff0c;它并不明确指出我们想要启动哪一个活动&#xff0c;而是指定了一系列更为抽象的action 和category 等信息&#xff0c;然后交由系统去分…

ALAssetsLibrary-代码操作iOS相册资源

2019独角兽企业重金招聘Python工程师标准>>> 在iOS中&#xff0c;我们调用摄像头和选择相册中的资源&#xff0c;我们可以使用&#xff1a;UIImagePickerController类来完成。 当然&#xff0c;我们也可以不使用UI的形式来访问iOS设备的相册资源。 那就是使用&#…

Android 四大组件 —— 活动(使用Intent 实现活动的显示跳转)

一、什么是Intent&#xff1f;Intent的中文意思是目的。在Android中也是“目的”的意思。就是我们要去哪里&#xff0c;从这个activity要前往另一个Activity就需要用到Intent。 下面是 Intent 两个最基本的函数&#xff1a; 1、定义一个Intent [java] view plaincopy Intent in…

Android 项目在Eclipse中的目录结构

Android工程目录 如果使用Eclipse插件ADT开发应用程序&#xff0c;必须要熟悉工程的目录结构&#xff0c;清楚各个目录下面放置的是什么东西。Android工程主要的目录有&#xff1a;src、bin、gen、res等。 不同的Android平台目录结构是不同的&#xff0c;下面以Android 2.3.…

Exynos4412 Uboot 编译工具 —— 交叉工具链 arm-linux-gcc 的安装

一、什么是交叉编译&#xff1f; 在开发主机运行编译器编译内核、应用程序。内核和程序在目标机上运行&#xff0c;这个编译过程被称为交叉编译。编译器运行在开发主机&#xff08;通常是X86体系的PC机&#xff09;上&#xff0c;编译出的的代码是目标机体系结构的&#xff0c;…

Linux学习之CentOS(一)--CentOS6.4环境搭建

一、前言作为一个想从事j2ee后台开发的程序猿&#xff0c;linux系统怎能不学呢&#xff1f;所以&#xff0c;这几天自己准备学习一下linux操作系统。废话不多说&#xff0c;直奔主题。要学linux开发&#xff0c;首先得要安装linux系统吧&#xff0c;这里我在选择之前也挺迷茫&a…

内联函数 —— C 中关键字 inline 用法解析

一、什么是内联函数 在C语言中&#xff0c;如果一些函数被频繁调用&#xff0c;不断地有函数入栈&#xff0c;即函数栈&#xff0c;会造成栈空间或栈内存的大量消耗。 为了解决这个问题&#xff0c;特别的引入了inline修饰符&#xff0c;表示为内联函数。 栈空间就是指放置程式…

eclipse maven scm

http://my.oschina.net/OutOfMemory/blog/178512 1.安装eclipse的maven插件 m2e(http://wiki.eclipse.org/M2E_updatesite_and_gittags)Help->Install New Software...在work with中填入我们需要安装m2e的版本url&#xff1a;http://download.eclipse.org/technology/m2e/…

DS18B20 驱动编写

嵌入式开发平台&#xff1a;mini2440 DS18B20 所用GPIO&#xff1a;S3C2410_GPF(3) 一、DS18B20 时序分析 DS18B20的一线工作协议流程是&#xff1a;初始化→ROM操作指令→存储器操作指令→数据传输&#xff0c;其工作时序包括&#xff1a;初始化时序、写时序、读时序。 1、初…