天天看點

Java IO(字元流的Buffered和Filter、Piped和CharArray)

字元流的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: 其他字元流(下)