Java中的IO分为两个部分,以InputStream和Reader为基类的输入类,以OutputStream和Writer为基类的输出类。其中InputStream和OutputStream以字节为单位进行IO,而Reader和Writer以字符为单位。
除了输入输出,还有一系列类库称为Filter,或成为装饰器。对于输入可用FilterInputStream和FilterReader的派生类,输出可用FilterOutputStream和FilterWriter的派生类,其中FilterInputStream和FilterOutputStream以字节为单位,FilterReader和FilterWriter以字符为单位。
还有一个独立与InputStream和OutputStream的—RandomAccessFile,用于对文件的读写,有点类似与C语言中的fopen()
所以可以总结,所有以Stream结尾的都是以字节为单位,也成为流;以Reader或Writer结尾的都以字符为单位。Reader和Writer在java1.1中才出现,如果需要进行转换,可以使用InputStreamReader和OutputStreamWriter。
过滤器(Filter)
Filter是对输入或输出进行一定的控制,如缓存、读取或写入基本数据类型等,用于更改流的一些行为。
FilterInputStream的派生类:
FilterOutputStream的派生类:
Reader和Writer中所用的Filter与InputStream和OutputStream中的Filter对比:
对于Filter的具体使用将在具体综合例子中讲到。
输入
输入分为输入字节和输入字符,分别使用基类是InputStream和Reader,如果需要把InputStrema转化为Reader,可以使用InputStreamReader。以下是一些InputStream常用的派生类与Writer与之对应的派生类。
InputStream派生类:
Reader与之对应的派生类:
将InputStream转成Reader示例:
// 创建一个InputStream类型的对象InputStream in = new FileInputStream(“data.txt”);// InputStreamReader继承自Reader,其构造方法接受一个InputStream对象Reader reader = new InputStreamReader(in);输出
输出分为输出字节和输出字符,分别使用基类是OutputStream和Writer,如果需要把OutputStrema转化为Writer,可以使用OutputStreamWriter。以下是一些OutputStream常用的派生类与Writer与之对应的派生类。
OutputStream派生类:
Writer与之对应的派生类:
将OutputStream转成Writer示例:
// 创建一个OutputStream类型的对象OutputStream out=new FileOutputStream(“data.txt”);// OutputStreamWriter继承自Writer,其构造方法接受一个OutputStream对象Writer writer=new OutputStreamWriter(out);综合示例
1、打开一个文件,并把其中的内容逐行输出的屏幕上。为了提高效率,这里将使用第一种过滤器BufferedReader,能够对输入进行缓冲。
public class Read {(String[]args) throws Exception{String file=”data.txt”;read(file);}(String file) throws Exception{BufferedReader in=new BufferedReader(new FileReader(file));String s;while((s=in.readLine())!=null)System.out.println(s);in.close();}}
2、从文件中按字节读取内容,需要用到DataInputStream过滤器,由于这里要对字节进行操作,所以要使用InputStream而不是Reader。其中对是否是用BufferedStream进行效率比较。
import java.io.*;public class ReadByte {(String[] args) throws Exception {String file = “data.txt”;long start;start = System.currentTimeMillis();// 记录运行开始时间readWithBufferedInputStream(file);System.out.println(“readWithBufferedInputStream use time:”+ (System.currentTimeMillis() – start));// 运行结束时间-开始时间就是运行时间start = System.currentTimeMillis();readWithoutBufferedInputStream(file);System.out.println(“readWithoutBufferedInputStream use time:”+ (System.currentTimeMillis() – start));}(String file)throws Exception {// 用BufferedInputStream进行读取文件DataInputStream in = new DataInputStream(new BufferedInputStream(new FileInputStream(file)));while (in.available() != 0)// DataInputStream剩余的字符数不为零则表示还没输出结束in.readByte();in.close();}(String file)throws Exception {// 不用BufferedInputStream读取文件DataInputStream in = new DataInputStream(new FileInputStream(file));while (in.available() != 0)in.readByte();in.close();}}因为有了梦想,我们才能拥有奋斗的目标,