1. 程式人生 > >JAVA中常用IO流類:BufferedReader和BufferedWriter

JAVA中常用IO流類:BufferedReader和BufferedWriter


 BufferedReader類用於緩衝讀取字元,將位元組流封裝成BufferedReader物件,然後用readLine()逐行讀入字元流,直到遇到換行符為止(相當於反覆呼叫Reader類物件的read()方法讀入多個字元)

下面摘抄自JAVA API文件

public class BufferedReader
extends Reader

從字元輸入流中讀取文字,緩衝各個字元,從而實現字元、陣列和行的高效讀取。

可以指定緩衝區的大小,或者可使用預設的大小。大多數情況下,預設值就足夠大了。

通常,Reader 所作的每個讀取請求都會導致對底層字元或位元組流進行相應的讀取請求。因此,建議用 BufferedReader 包裝所有其 read() 操作可能開銷很高的 Reader(如 FileReader 和 InputStreamReader)。例如,

 BufferedReader in
   = new BufferedReader(new FileReader("foo.in"));
 

將緩衝指定檔案的輸入。如果沒有緩衝,則每次呼叫 read() 或 readLine() 都會導致從檔案中讀取位元組,並將其轉換為字元後返回,而這是極其低效的。

通過用合適的 BufferedReader 替代每個 DataInputStream,可以對將 DataInputStream 用於文字輸入的程式進行本地化。

行本地化。

構造方法摘要

          建立一個使用指定大小輸入緩衝區的緩衝字元輸入流。
 
方法摘要
 void close
()

          關閉該流並釋放與之關聯的所有資源。
 void mark(int readAheadLimit)
          標記流中的當前位置。
 boolean
          判斷此流是否支援 mark() 操作(它一定支援)。
 int read()
          讀取單個字元。
 int read(char[] cbuf, int off, int len)
          將字元讀入陣列的某一部分。
 boolean ready()
          判斷此流是否已準備好被讀取。
 void reset()
          將流重置到最新的標記。
 long skip(long n)
          跳過字元。

BufferedWriter提供字元的緩衝寫出功能

以下摘自JAVA API文件

public class BufferedWriter
extends Writer

將文字寫入字元輸出流,緩衝各個字元,從而提供單個字元、陣列和字串的高效寫入。

可以指定緩衝區的大小,或者接受預設的大小。在大多數情況下,預設值就足夠大了。

該類提供了 newLine() 方法,它使用平臺自己的行分隔符概念,此概念由系統屬性line.separator定義。並非所有平臺都使用新行符 ('\n') 來終止各行。因此呼叫此方法來終止每個輸出行要優於直接寫入新行符。

通常 Writer 將其輸出立即傳送到底層字元或位元組流。除非要求提示輸出,否則建議用 BufferedWriter 包裝所有其 write() 操作可能開銷很高的 Writer(如 FileWriters 和 OutputStreamWriters)。例如,

 PrintWriter out
   = new PrintWriter(new BufferedWriter(new FileWriter("foo.out")));
 

將緩衝 PrintWriter 對檔案的輸出。如果沒有緩衝,則每次呼叫 print() 方法會導致將字元轉換為位元組,然後立即寫入到檔案,而這是極其低效的。

例項:使用字元處理流實現檔案複製

import java.io.*;
class IODemo
{
	public static void main(String[] args) 
	{
		try
		{
		//使用BufferedReader和BufferedWriter進行檔案複製(操作的是字元,以行為單位讀入字元)
		FileReader fr=new FileReader("a.txt");
		BufferedReader br=new BufferedReader(fr);
		FileWriter fw=new FileWriter("d.txt");
		BufferedWriter bw=new BufferedWriter(fw);

		String s=br.readLine();
			while(null!=s)
			{
				bw.write(s);
				//由於BufferedReader的rendLIne()是不讀入換行符的,所以寫入換行時須用newLine()方法
				bw.newLine();
				//read=fis.read(b);
				s=br.readLine();
			}

			br.close();
			bw.close();
		}
		catch (IOException e)
		{
			e.printStackTrace();
		}
		
	}
}

 注:議用 BufferedReader 包裝所有其 read() 操作可能開銷很高的 Reader(如 FileReader 和 InputStreamReader)。