この種のオーバーヘッドを削減するために、JavaプラットフォームではバッファI/Oストリームを実装しています。 バッファ入力ストリームでは、バッファと呼ばれるメモリ領域からデータを読み取ります。これにより、ネイティブな入力APIが呼び出されるのは、バッファが空の場合のみとなります。 同様に、バッファ出力ストリームではデータをバッファに書き込み、ネイティブな出力APIが呼び出されるのはバッファがいっぱいの場合のみです。
これまで何度か使用してきた"ラップ"の手法により、非バッファ・ストリームをバッファ・ストリームに変換できます。つまり、非バッファ・ストリーム・オブジェクトをバッファ・ストリーム・クラスのコンストラクタに渡します。 サンプル・プログラムCopyCharactersでバッファI/Oを使用するには、コンストラクタの呼出しを以下のように変更します。
inputStream =
new BufferedReader(new FileReader("xanadu.txt"));
outputStream =
new BufferedWriter(new FileWriter("characteroutput.txt"));
BufferedInputStreamおよびBufferedOutputStreamと、バッファ文字ストリームを作成するBufferedReaderおよびBufferedWriterです。
バッファ出力クラスの中には、自動フラッシュをサポートするものがあります。自動フラッシュは、コンストラクタのオプション引数で指定します。 自動フラッシュが有効な場合は、特定の主要なイベントの発生時にバッファがフラッシュされます。 たとえば、PrintWriterオブジェクトに自動フラッシュを指定すると、バッファはprintlnまたはformatが呼び出されるたびにフラッシュされます。 これらのメソッドに関する詳細は、フォーマットを確認してください。
ストリームを手動でフラッシュするには、flushメソッドを呼び出します。 flushメソッドはあらゆる出力ストリームで有効ですが、非バッファ・ストリームには効果はありません。