一、什么是带缓冲的流
在字符流中可以使用带缓冲的字符流提高文件读写的效率,这种效率的提高是显著的而且有时是必须的。带缓冲提供一个较大的缓冲区,通过减少文件读取或写入次数以提高IO流的效率,比如相比较使用一个int的长度是4byte临时变量,使用而默认的BufferedReader缓冲区大小是4k byte,减少读取的次数是4×1024/8=1024倍。
缓存流可以修饰原始的字节流和字符流,带缓存的字节流类是:java.io.BufferedInputStream和java.io.BufferedOutputStream,
而带缓存的字符流是:
java.io.BufferedReader和java.io.BufferedWriter。
在学习javaIO时会发现该API下存在大量的修饰器模式,修饰器模式下以一种功能”低级”的流去修饰功能更为“高级”流,从而得到更为高级的功能。BufferedReader的构造器有两个构造函数:
BufferedReader(Read in);
BufferedReader(Read in,int size);
前面一种方式使用一个Reader的实例去修饰BufferedReader,使用默认大小的缓冲器的带缓冲字符流。而第二种构造缓冲器长度是由size设定。
跟BufferedReader一样,BufferedWriter的构造器也有两种重载的格式:
BufferedWriter(Writer out);
BufferedWriter(Writer out, int size);
字节缓冲输入/输出是一个非常普通的性能优化。Java 的BufferedInputStream 类允许把任何InputStream 类“包装”成缓冲流并使它的性能提高。BufferedInputStream 有两个构造函数:
BufferedInputStream(InputStream inputStream)
BufferedInputStream(InputStream inputStream, int bufSize)
而对应的缓冲输出流BufferedOutputStream
BufferedOutputStream与任何一个OutputStream相同,因为BufferedOutputStream是通过减小系统写数据的时间而提高性能的,可以调用flush( )方法生成缓冲器中待写的数据。下面是两个可用的构造函数:
BufferedOutputStream(OutputStream outputStream)
BufferedOutputStream(OutputStream outputStream, int bufSize)
第一种形式创建了一个使用512字节缓冲器的缓冲流。第二种形式,缓冲器的大小由bufSize参数传入。
在带缓冲的输出流中,一般都增加了flush()方法,flush()方法的作用是确保数据缓冲器确实被写到实际的输出流。用BufferedWriter可以通过减小数据被实际的写到输出流的次数而提高程序的性能。对于字节流缓冲流(buffered stream),通过把内存缓冲器连到输入/输出流扩展一个过滤流类。该缓冲器允许Java对多个字节同时进行输入/输出操作,提高了程序性能。
二、带缓存的字符流
使用带缓存的字符流修饰原始的字符流,代码如下:
public void input(){
try{
//带缓冲的字符流
BufferedReader bufreader=new BufferReader(new FileReader("e://abc.txt"));
while(bufreader.ready()){
//可以一次读取一行
System.out.println(bufreader.readLine());
}
}catch(FileNotFoundException e){
e.printStackTrace();
}catch(IOException e){
e.printStackTrace();
}
}
public void output(){
try{
BufferedWiter writer=new BufferedWriter(new FileWriter(new File("e://abc.txt")));
writer.write("大家好啊!I say:\" \";\r\n");
writer.write("不好");
writer.flush();//要调用flush方法
writer.close();
}catch(FileNotFoundException e){
e.printStackTrace();
}catch(IOException e){
e.printStackTrace();
}
}
三、带缓存的字节流
我们已经学过带缓冲的字符流BufferedReader和BufferedWriter,带缓冲的字节流跟前者非常相似,要改写上面的程序非常简单,只需要分别创建BufferedInputStream /BufferedOutputStream对象,将原来代码中的fis和fout进行修饰即可,对大量的文本读取性能有很大提高。示例代码如下:
public void input(){
try{
InputStream input=new FileInputStream("e://abc.txt");
//如果修饰的是字节流,带缓冲的字节流
BufferedInputStream buinput=new BufferedInputStream(input);
//每次读取数据的零时变量,每次读32位4byte
int tmp=0;
//循环读取,最后读到末尾返回-1
while((tmp=buinput.read())!=-1){
//每读一次写一次
System.out.println((char)tmp);
}
buinput.close();
}catch(FileNotFoundException e){
e.printStackTrace();
}catch(IOException e){
e.printStackTrace();
}
}
public void output(){
try{
FileOutputStream output=new FileOutputStream("e://abc.txt");
BufferedOutputStream buoutput=new BufferedOutputStream(output);
buoutput.write('a');
buoutput.write('b');
buoutput.flush();
//释放资源
buoutput.close();
}catch(FileNotFoundException e){
e.printStackTrace();
}catch(IOException e){
e.printStackTrace();
}
}