ITEEDU

Java Gossip: BufferedReader、BufferedWriter

BufferedReader与BufferedWriter类别各拥有8192个字符的缓冲区,当读入或写出字符数据时,会先尽量从缓冲区读取。例如BufferedReader在读取文本文件时,会先将字符数据读入缓冲区,而之后若使用read()方法时,会先从缓冲区中进行读取,如果缓冲区数据不足,才会再从档案中读取,藉由缓冲区,可以减少对磁盘的I/O动作,藉以提高程序的效率。

而使用BufferedWriter时,写出的数据并不会先输出至目的地,而是先储存至缓冲区中,如果缓冲区中的数据满了,才会一次对目的地进行写出,例如一个目标档案,藉由缓冲区,可以减少对磁盘的I/O动作,藉以提高程序的效率。

其实之前就常使用BufferedReader,您从标准输入串流System.in中直接读取使用者输入时,每当使用者输入一个字符,则 System.in就读取一个字符,之前为了要能一次读取一行使用者的输入,使用了BufferedReader来对使用者输入的字符进行缓冲, readLine()方法会在读取到使用者的换行字符时,再一次将整行字符串传入。

System.in是个位串流,为了转换为字符串流,您使用InputStreamReader为其进行字符转换,然后再使用BufferedReader为其增加缓冲功能,例如:

BufferedReader bufReader =new BufferedReader(new InputStreamReader(System.in));

下次这个程序示范了BufferedReader与BufferedWriter的使用,您可以在文字模式下输入字符,程序会将您输入的文字储存至指定的档案中,如果要结束程序,输入quit字符串即可:

BufferedReaderWriterDemo.java
package onlyfun.caterpillar;
import java.io.*;
public class BufferedReaderWriterDemo {
	public static void main(String[] args) {
		try {
			BufferedReader bufReader =
			new BufferedReader(
			new InputStreamReader(System.in));
			BufferedWriter bufWriter =
			new BufferedWriter(new FileWriter(args[0]));
			String keyin = null;
			while(!(keyin =
			bufReader.readLine()).equals("quit")) {
				bufWriter.write(keyin);
				bufWriter.newLine();
			}
			bufReader.close();
			bufWriter.close();
		}
		catch(ArrayIndexOutOfBoundsException e) {
			e.printStackTrace();
		}
		catch(IOException e) {
			e.printStackTrace();
		}
	}
}