本章節将簡要介紹緩沖與過濾相關的reader和writer,主要涉及bufferedreader、bufferedwriter、filterreader、filterwriter。
<a href="http://tutorials.jenkov.com/java-io/bufferedreader.html">原文連結</a>
bufferedreader能為字元輸入流提供緩沖區,可以提高許多io處理的速度。你可以一次讀取一大塊的資料,而不需要每次從網絡或者磁盤中一次讀取一個位元組。特别是在通路大量磁盤資料時,緩沖通常會讓io快上許多。
bufferedreader和bufferedinputstream的主要差別在于,bufferedreader操作字元,而bufferedinputstream操作原始位元組。隻需要把reader包裝到bufferedreader中,就可以為reader添加緩沖區(譯者注:預設緩沖區大小為8192位元組,即8kb)。代碼如下:
<code>1</code>
<code>reader input = </code><code>new</code> <code>bufferedreader(</code><code>new</code> <code>filereader(</code><code>"c:\\data\\input-file.txt"</code><code>));</code>
你也可以通過傳遞構造函數的第二個參數,指定緩沖區大小,代碼如下:
<code>reader input = </code><code>new</code> <code>bufferedreader(</code><code>new</code> <code>filereader(</code><code>"c:\\data\\input-file.txt"</code><code>), </code><code>8</code> <code>* </code><code>1024</code><code>);</code>
這個例子設定了8kb的緩沖區。最好把緩沖區大小設定成1024位元組的整數倍,這樣能更高效地利用内置緩沖區的磁盤。
除了能夠為輸入流提供緩沖區以外,其餘方面bufferedreader基本與reader類似。bufferedreader還有一個額外readline()方法,可以友善地一次性讀取一整行字元。
<a href="http://tutorials.jenkov.com/java-io/bufferedwriter.html">原文連結</a>
與bufferedreader類似,bufferedwriter可以為輸出流提供緩沖區。可以構造一個使用預設大小緩沖區的bufferedwriter(譯者注:預設緩沖區大小8 * 1024b),代碼如下:
<code>writer writer = </code><code>new</code> <code>bufferedwriter(</code><code>new</code> <code>filewriter(</code><code>"c:\\data\\output-file.txt"</code><code>));</code>
也可以手動設定緩沖區大小,代碼如下:
<code>writer writer = </code><code>new</code> <code>bufferedwriter(</code><code>new</code> <code>filewriter(</code><code>"c:\\data\\output-file.txt"</code><code>), </code><code>8</code> <code>* </code><code>1024</code><code>);</code>
為了更好地使用内置緩沖區的磁盤,同樣建議把緩沖區大小設定成1024的整數倍。除了能夠為輸出流提供緩沖區以外,其餘方面bufferedwriter基本與writer類似。類似地,bufferedwriter也提供了writeline()方法,能夠把一行字元寫入到底層的字元輸出流中。值得注意是,你需要手動flush()方法確定寫入到此輸出流的資料真正寫入到磁盤或者網絡中。
<a href="http://tutorials.jenkov.com/java-io/filterreader.html">原文連結</a>
與filterinputstream類似,filterreader是實作自定義過濾輸入字元流的基類,基本上它僅僅隻是簡單覆寫了reader中的所有方法。
就我自己而言,我沒發現這個類明顯的用途。除了構造函數取一個reader變量作為參數之外,我沒看到filterreader任何對reader新增或者修改的地方。如果你選擇繼承filterreader實作自定義的類,同樣也可以直接繼承自reader進而避免額外的類層級結構。