2011-08-23 56 views
43

標準出力ストリームではないのに、特定のストリームをフラッシュする必要があります(FileOutputStreamおよびソケットからのストリーム)。JavaでSystem.out.flush()を呼び出す理由/理由

誰かがprintln()またはwrite()を呼び出しながらも、System.outPrintStreamオブジェクトを使用するたびに、彼らは、ストリームをフラッシュすることはありません。しかし、他のプログラマは、とPrintStream/PrintWriterを他のストリームと常時呼びます。

私は最近いくつかのプログラマーにこの質問をしましたが、いくつかのバックグラウンド処理ではSystem.outストリームを自動フラッシュするJavaがあると信じていますが、それに関するドキュメントは見つかりません。

このようなことは、一部のシステムでストリームをフラッシュする必要がある場合があるため、単にSystem.out.println()をプラットフォームに依存しないと思うのですか?

答えて

43

System.outは、デフォルトでは改行が書き込まれるたびにフラッシュされるPrintStreamに基づいています。 javadocから

自動フラッシュ - ブール値。 trueの場合、バイト配列が書き込まれるたびに、出力バッファがフラッシュされます、printlnのいずれかの方法が呼び出される、または改行文字またはバイト('\n'

を書かれているので、あなたが言及println場合は、明示的に処理されますまた、writeのケースがbyte[]である場合は、「バイト配列が書き込まれるたびに」になるため、フラッシュされることも保証されます。

System.setOutを使用してSystem.outを置き換え、自動フラッシュストリームを使用しない場合は、他のストリームと同じようにフラッシュする必要があります。

ライブラリコードではSystem.outを直接使用するべきではありませんが、ライブラリユーザーがSystem.outをオーバーライドして非フラッシングストリームを使用する可能性があるため、フラッシュするよう注意してください。

System.outにバイナリ出力を書き込むJavaプログラムは、バイナリ出力に後続の改行が含まれないことが多いため、より前には、exitより前に注意してください。

+3

「真ならば」有効ですが、それは? System.outのautoFlushの値についてのドキュメントは見つかりませんでした。 –

+1

@Carlos、JVMをブートストラップし、 'System.out'と' System.err'となるメインクラスを起動するシステムまでです縛られ、どのようにそれらがフラッシュする。 'java'バイナリを使ってクラス' System.out'を起動すると、 'new PrintStream(new FileOutputStream(FileDescriptor.out)、true、System.getProperty(" file.encoding "))'のように初期化されます。 JVMは異なります。明らかに、アプレットを埋め込んでいるJVMは、何か違うことをしています。 –

+0

@MikeSamuel、それで、自動フラッシュの動作が**仕様によって**保証されていないので、私はまだ*フラッシュする必要があることを意味しますか? – Pacerier

2

デフォルトでは、System.outはラインバッファです。したがって、printlnを呼び出していて、printでない場合は、問題ではありません。詳細はthis articleを参照してください。 PrintStream documentation

から
+1

申し訳ありませんが、printlnを使用してPrintStreamのautoflushを取得する必要はありません。確認してください。 –

5

自動的にフラッシュするように必要に応じて、PrintStreamを作成することができます。つまり、flushメソッドは、バイト配列が書き込まれた後に自動的に呼び出され、printlnメソッドの1つが呼び出されるか、改行文字またはバイト('\n')が書き込まれます。

ドキュメントに明示的に記載されていませんが、System.outはこの自動フラッシュを実行すると私は理解しています。

3

アイテムが表示されるのを待つことができない場合は、ストリームをフラッシュします。

JVMがダウンすると、ストリームをフラッシュしないと表示バッファ内のアイテムが失われる危険性があります。そのため、JVMが永久に失われた理由を示す合理的なエラーメッセージが表示される可能性があります。そのため、デバッグは難しくなります。人々は「これを印刷するので、ここには到達しませんでした」という傾向があります。

関連する問題