虽然在Reader父类与Writer父类中已经有了可以自己构造缓冲区并批量读取的方法read(char[] cbuf, int off, int len)、write(char[] cbuf, int off, int len);其中的cbuf字符数组就是缓冲区,但是java中已经为我们封装好了缓冲区类BufferedWriter与BufferedReader。我们来看看BufferedWriter的定义:将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。
可以指定缓冲区的大小,或者接受默认的大小。BufferedReader定义类似。那么我们就来试试怎么用两个缓冲区类。代码如下:
/**
* @Title: IObufferDemo.java
* @Package IOBuffer
* @Description: TODO(介绍IO类中缓冲区类Buffer的用法)
* @author Shaw
* @date 2014年12月15日 下午7:54:50
* @version V1.0
*/
package IOBuffer;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class IObufferDemo {
/**
* @throws IOException
* @Title: main
* @Description: TODO(介绍IO类中缓冲区类Buffer的用法)
* @param @param args
*/
public static void main(String[] args) throws IOException {
bufferWriterShow();
bufferReaderShow();
}
public static void bufferWriterShow() throws IOException {
// TODO Writer方法展示
FileWriter fw = new FileWriter("buf.txt");
//为了提高效率,使用字符流的缓冲区。
BufferedWriter bufw = new BufferedWriter(fw);
bufw.write("balbljbidfe");
bufw.newLine();
bufw.write("dddddddd");
//使用缓冲区的刷新方法将数据刷到目的地中
bufw.flush();
//关闭缓冲区。其实关闭的就是被缓冲的流对象。
//缓冲区仅提高效率
bufw.close();
}
public static void bufferReaderShow() throws IOException {
// TODO Reader方法展示
FileReader fr = new FileReader("buf.txt");//从外设中读取文件数据,该文件必须存在
//为了提高效率,使用字符流的缓冲区。
BufferedReader bufr = new BufferedReader(fr);
//尝试BufferedReader中的方法readLine();
String line = null;
while((line = bufr.readLine())!=null){
System.out.println(line);
}
}
}
我们看到基本上和FileReader与FileWriter类没啥区别。有意思的一点是BufferedWriter类中有一个newLine()函数以及BufferedReader类中的readLine()函数。newLine()函数表示的是换行功能,readLine()函数表示的是读取文件中的一行的功能。这给我们在操作中提供了便利。我们来分析分析readLine()方法的具体操作过程:
首先,在生成缓冲区对象bufr(BufferedReader bufr = new BufferedReader(fr);)的同时,系统会调用bufr.read(buf);将硬盘中的数据部分读入到内存缓冲区中。此时bufr.read()方法(已经复写了父类Reader中的read()方法)即是从内存中读取数据,而父类Reader中的read()是从硬盘中读取数据,相比之下bufr.read()方法高效很多。那么,此时的readLine()方法如何读取一行的呢?实际上,在调用readLine()方法时候,该方法会调用一个临时容器(如StringBuilder),暂时存储通过bufr.read()方法从内存中得到的字符,在读取到换行字符的时候,该临时容器不再存入,而是直接输出(如图所示的字符串“abc”).