字元流的Buffered和Filter
簡要介紹緩沖與過濾相關的reader和writer,主要涉及BufferedReader、BufferedWriter、FilterReader、FilterWriter。
1.1 BufferedReader
BufferedReader能為字元輸入流提供緩沖區,可以提高許多IO處理的速度。你可以一次讀取一大塊的資料,而不需要每次從網絡或者磁盤中一次讀取一個位元組。特别是在通路大量磁盤資料時,緩沖通常會讓IO快上許多。
BufferedReader和BufferedInputStream的主要差別在于,BufferedReader操作字元,而BufferedInputStream操作原始位元組。隻需要把Reader包裝到BufferedReader中,就可以為Reader添加緩沖區(譯者注:預設緩沖區大小為8192位元組,即8KB)。
Reader input = new BufferedReader(new FileReader("c:\\data\\input-file.txt"));
你也可以通過傳遞構造函數的第二個參數,指定緩沖區大小
Reader input = new BufferedReader(new FileReader("c:\\data\\input-file.txt"), 8 * 1024);
這個例子設定了8KB的緩沖區。最好把緩沖區大小設定成1024位元組的整數倍,這樣能更高效地利用内置緩沖區的磁盤。
除了能夠為輸入流提供緩沖區以外,其餘方面BufferedReader基本與Reader類似。BufferedReader還有一個額外readLine()方法,可以友善地一次性讀取一整行字元。
1.2 BufferedWriter
與BufferedReader類似,BufferedWriter可以為輸出流提供緩沖區。可以構造一個使用預設大小緩沖區的BufferedWriter(譯者注:預設緩沖區大小8 * 1024B)
Writer writer = new BufferedWriter(new FileWriter("c:\\data\\output-file.txt"));
也可以手動設定緩沖區大小
Writer writer = new BufferedWriter(new FileWriter("c:\\data\\output-file.txt"), 8 * 1024);
為了更好地使用内置緩沖區的磁盤,同樣建議把緩沖區大小設定成1024的整數倍。除了能夠為輸出流提供緩沖區以外,其餘方面BufferedWriter基本與Writer類似。類似地,BufferedWriter也提供了writeLine()方法,能夠把一行字元寫入到底層的字元輸出流中。值得注意是,你需要手動flush()方法確定寫入到此輸出流的資料真正寫入到磁盤或者網絡中。
字元流的Piped和CharArray
簡要介紹管道與字元數組相關的reader和writer,主要涉及PipedReader、PipedWriter、CharArrayReader、CharArrayWriter。
2.1 PipedReader
PipedReader能夠從管道中讀取字元流。與PipedInputStream類似,不同的是PipedReader讀取的是字元而非位元組。換句話說,PipedReader用于讀取管道中的文本。
Reader reader = new PipedReader(pipedWriter);
int data = reader.read();
while(data != -1) {
//do something with data...
doSomethingWithData(data);
data = reader.read();
}
reader.close();
一個PipedReader需要與一個PipedWriter相關聯,當這兩種流聯系起來時,就形成了一條管道。
2.2 PipedWriter
PipedWriter能夠往管道中寫入字元流。與PipedOutputStream類似,不同的是PipedWriter處理的是字元而非位元組,PipedWriter用于寫入文本資料。
PipedWriter writer = new PipedWriter(pipedReader);
while(moreData()) {
int data = getMoreData();
writer.write(data);
}
writer.close();
PipedWriter的write()方法取一個包含了待寫入位元組的int類型變量作為參數進行寫入,同時也有采用字元串、字元數組作為參數的write()方法。
2.3 CharArrayReader
CharArrayReader能夠讓你從字元數組中讀取字元流。
char[] chars = ... //get char array from somewhere.
Reader reader = new CharArrayReader(chars);
int data = reader.read();
while(data != -1) {
//do something with data
data = reader.read();
}
reader.close();
如果資料的存儲媒介是字元數組,CharArrayReader可以很友善的讀取到你想要的資料。CharArrayReader會包含一個字元數組,然後将字元數組轉換成字元流。
2.4 CharArrayWriter
CharArrayWriter能夠把字元寫入到字元輸出流writer中,并且能夠将寫入的字元轉換成字元數組。
CharArrayWriter writer = new CharArrayWriter();
//write characters to writer.
char[] chars = writer.toCharArray();
當你需要以字元數組的形式通路寫入到writer中的字元流資料時,CharArrayWriter是個不錯的選擇。
備注:文章參考
Java IO: 字元流的Buffered和Filter
Java IO: 字元流的Piped和CharArray
Java IO: 其他位元組流(上)
Java IO: 其他字元流(下)