API仕様書でBufferedWriterについて調べると、次のようにある。
■BufferedWriter (Java Platform SE 6) http://docs.oracle.com/javase/jp/6/api/java/io/BufferedWriter.html
一般的に、Writer は、その出力をただちに基本となる文字型ストリームまたはバイトストリームに送信します。 プロンプト出力を必要とする場合以外では、FileWriter や OutputStreamWriter のような Writer から直接 write() オペレーションを呼び出すのは効率が悪いので、BufferedWriter でラップすることをお勧めします。
この中に「プロンプト出力」という単語があるが、意味がわからない。
プロンプトというのは、コマンドの入力が受付可能であることを示すために表示するものではないのか?
データ出力中にプロンプト!?
というわけで「プロンプト出力」というのはなんぞや、とGoogleで調べると
「コマンドプロンプト」の話がわんさか出てくる。orz
仕方が無いので「-コマンドプロンプト」を検索ワードに加えてそれが出ないようにしても、
結局「プロンプト出力とは何か」を解説したページは見つからない。
そっか、原著(=英語版)には別な表現で書かれているかもしれんぞ!?
と思い原著をあたる。
■BufferedWriter (Java Platform SE 6) http://docs.oracle.com/javase/6/docs/api/java/io/BufferedWriter.html
In general, a Writer sends its output immediately to the underlying character or byte stream. Unless prompt output is required, it is advisable to wrap a BufferedWriter around any Writer whose write() operations may be costly, such as FileWriters and OutputStreamWriters.
…同じだった orz
データを出力中にコマンドを受け付けることなんて果たしてあるのか?
だとして、誰がコマンドを入力するんだ!?
それとも単に「標準出力」の意味でとればいいのか!?
謎は解決されない。
…などと書いていたが、次のページを読んでなんとなく納得した。
■Java言語(文字ストリーム) http://www.is.akita-u.ac.jp/~sig/lecture/java/char-stream.html
やはりここでいう「プロンプト」は、コマンド入力を促す何か、ということでいいようだ。
つまり対話型の出力をしている場合(入力されたコマンドに応じてコンソールに結果を出力するとか、
ネットワーク越しに何らかのプロトコルを使ってデータのやり取りをする場合かな~)、
BufferedWriterでは「バッファがいっぱいになるまで(flushとか実行されない限り)出力がされない」
とかそんな挙動なので、対話がしづらくなるのであろう。
つまり、データを送る側は
「もう出力すべき内容は全部バッファリングし終わっていてコマンド入力受付可能なので、プロンプトもバッファリングした」のに、
「バッファが一杯になっていないのでプロンプトが出力されない」
という状態が起こりうるわけだ。
従って、対話式出力の場合はBufferedWriterを使ってはならんわけだ。
でも対話式ではない場合は、BufferedWriterの方が効率がいいですよ、ってことだ。
単にファイルにデータを出すだけならやっぱりBufferedWriterだな~。