このページを正しく表示するには、ブラウザでJavaScriptを有効にする必要があります。
コース: 重要なクラス
レッスン: 基本的なI/O
セクション: I/Oストリーム
バッファ・ストリーム
ホームページ > 重要なクラス > 基本的なI/O

バッファ・ストリーム

これまでに見てきたサンプル・プログラムのほとんどは、非バッファI/Oを使用しています。これは、各読取り要求または書込み要求が、基盤となるOSによって直接処理されることを意味します。 このようなプログラムは、効率が大幅に低下する恐れがあります。多くの場合、こうした要求のたびに、ディスク・アクセスやネットワーク・アクティビティ、その他比較的負荷の高い処理が発生するためです。

この種のオーバーヘッドを削減するために、JavaプラットフォームではバッファI/Oストリームを実装しています。 バッファ入力ストリームでは、バッファと呼ばれるメモリ領域からデータを読み取ります。これにより、ネイティブな入力APIが呼び出されるのは、バッファが空の場合のみとなります。 同様に、バッファ出力ストリームではデータをバッファに書き込み、ネイティブな出力APIが呼び出されるのはバッファがいっぱいの場合のみです。

これまで何度か使用してきた"ラップ"の手法により、非バッファ・ストリームをバッファ・ストリームに変換できます。つまり、非バッファ・ストリーム・オブジェクトをバッファ・ストリーム・クラスのコンストラクタに渡します。 サンプル・プログラムCopyCharactersでバッファI/Oを使用するには、コンストラクタの呼出しを以下のように変更します。

        inputStream = 
            new BufferedReader(new FileReader("xanadu.txt"));
        outputStream = 
            new BufferedWriter(new FileWriter("characteroutput.txt"));
非バッファ・ストリームをラップするために使用できるバッファ・ストリーム・クラスは4つあります。 バッファ・バイト・ストリームを作成するBufferedInputStreamおよびBufferedOutputStreamと、バッファ文字ストリームを作成するBufferedReaderおよびBufferedWriterです。

バッファ・ストリームのフラッシュ

バッファがいっぱいになる前に、重要なタイミングでバッファを書き出すことが適切な場合もあります。 この動作を、バッファのフラッシュといいます。

バッファ出力クラスの中には、自動フラッシュをサポートするものがあります。自動フラッシュは、コンストラクタのオプション引数で指定します。 自動フラッシュが有効な場合は、特定の主要なイベントの発生時にバッファがフラッシュされます。 たとえば、PrintWriterオブジェクトに自動フラッシュを指定すると、バッファはprintlnまたはformatが呼び出されるたびにフラッシュされます。 これらのメソッドに関する詳細は、フォーマットを確認してください。

ストリームを手動でフラッシュするには、flushメソッドを呼び出します。 flushメソッドはあらゆる出力ストリームで有効ですが、非バッファ・ストリームには効果はありません。


サンプル・プログラムで問題が発生した場合は、 『Compiling and Running the Examples: FAQs』を参照してください。
フィードバックをお寄せください。さまざまなご意見をお待ちしております。

前のページ: 文字ストリーム
次のページ: スキャンとフォーマット