2012-02-22 9 views
6

今日はSystem.out.print()についての議論を聞いたことがあります。ある人は、には終端のある\nが含まれていないので、書き込み先のバッファは最終的にいっぱいになってデータを失うと主張しています。他の人は、すべてのJavaプログラムにSystem.out.print()を使用していたと主張し、この問題に遭遇したことはありませんでした。JavaのSystem.out.print()バッファはprintln()まで永遠にバッファリングされますか?

最初の人は正しいですか? System.out.print()はstdoutがいっぱいの場合、データのブロックまたはドロップを開始できますか?これを引き起こすコードの例はありますか?

+2

'System.out'を例外をスローするカスタムストリームに置き換えるために' System.setOut() 'を使用してください。 – paislee

+4

両方とも間違っています。 '\ n'はそれとは関係がありません。' .close() 'や' .flush() 'を呼び出すと、ストリームの内容が書き出されたり、失われたりすることがあります。 –

答えて

11

System.out.printで使用されるバッファがいっぱいになると、出力はファイル(またはターミナルまたはプログラムの標準出力ストリームに接続されている他のデータターゲット)に書き込まれ、結果として空のバッファになります。バッファサイズを気にせずに出力を書き込むことは、通常の使用法です。 flushを呼び出さないように、プログラムをクラッシュまたはブロックしたり、データを失うことはありません。

プログラムの外部でデータをすぐに利用できるようにする必要がある場合は、flushに明示的に電話する必要があります。たとえば、プログラムが別のプログラムとデータを交換していて、そのプログラムに要求を送信してそのプログラムの応答を待つ場合は、要求を送信した後にもう1つのプログラムが受信することを確認してからに電話する必要がありますそれ。同様に、あなたのプログラム(またはそれが走るマシン)がクラッシュした場合、最後にflushを呼び出した時までの出力だけが書き出されていることが保証されます。

ストリームが自動的にフラッシュされるように設定されている場合は、改行文字を(明示的にまたはprintlnを通して)書き込むことは、flushと同じくらい効果的です。 closeを呼び出すと、flushも呼び出されます(そのため、closeIOExceptionをスローする可能性があります。ストリームがフルディスク上のファイルに接続されているなど)、データを書き出して再生できない可能性があります。

System.outに接続されているストリームがすぐにデータを受信する準備ができていない場合、バッファをフラッシュするとプログラムがブロックされることがあります(たとえば、データがすぐに入力を読み取らない別のプログラムにパイプされている)。バッファはいつでも(バッファがいっぱいになるため)フラッシュできるため、空でない引数を持つprintの呼び出しはブロックされる可能性があります。

詳細については、buffered streams tutorialおよびjava.io.PrintStream classのマニュアルを参照してください。

関連する問題