From Gossip@Openhome

Java Gossip: BufferedReader、BufferedWriter

BufferedReader與BufferedWriter類別各擁有緩衝區可查閱標準API原始碼瞭解預設大小當讀入或寫出字元資料時,會先儘量從緩衝區讀取。例如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的使用,您可以在文字模式下輸入字元,程式會將您輸入的文字儲存至指定的 檔案中,如果要結束程式,null的判斷則依平台而有所不同,在UNIX-Like平台下,使用Ctrl+d字元作為讀取結束或檔案結束,在 Windows之下,則是在使用者按下Enter鍵後,接著Ctrl+z表示讀取結束或檔案結束:

  • 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()) != null) {
bufWriter.write(keyin);
bufWriter.newLine();
}

bufReader.close();
bufWriter.close();
}
catch(ArrayIndexOutOfBoundsException e) {
e.printStackTrace();
}
catch(IOException e) {
e.printStackTrace();
}
}
}