java IO字符流 缓冲区类BufferedWriter与BufferedReader的用法

虽然在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()方法的具体操作过程:

java IO字符流 缓冲区类BufferedWriter与BufferedReader的用法_第1张图片


首先,在生成缓冲区对象bufr(BufferedReader bufr = new BufferedReader(fr);)的同时,系统会调用bufr.read(buf);将硬盘中的数据部分读入到内存缓冲区中。此时bufr.read()方法(已经复写了父类Reader中的read()方法)即是从内存中读取数据,而父类Reader中的read()是从硬盘中读取数据,相比之下bufr.read()方法高效很多。那么,此时的readLine()方法如何读取一行的呢?实际上,在调用readLine()方法时候,该方法会调用一个临时容器(如StringBuilder),暂时存储通过bufr.read()方法从内存中得到的字符,在读取到换行字符的时候,该临时容器不再存入,而是直接输出(如图所示的字符串“abc”).

你可能感兴趣的:(java学习)