12

私はエクリプスを使用しています。次のようなアプリケーションがある場合:

write 20 times 'Hello World\n' to stdout
write 'ERROR\n' to stderr
write 5 times 'Hello  World\n' to stdout

出力は何度も次のようになります。

Hello World
Hello World
Hello World
Hello World
Hello World
Hello World
...
Hello World
Hello World
Hello World
ERROR

これら 2 つの出力ストリームを同期する方法はありますか? もちろん、20回のブロック後に数ミリ秒待たずにHello World、印刷後に数ミリ秒待ちますERROR

4

5 に答える 5

8

信じられないかもしれませんが、フラッシングはここでは解決策ではありません....

ストリームが「基礎となるオペレーティング システムによって提供される抽象化」(ディスク ドライブやコンソールなど) につながる場合、残りのバイトは「書き込みのためにオペレーティング システムに渡されます。実際に書き込まれることは保証されません...」( OutputStream のドキュメントを参照してください)。ここで重要なのは、OS が選択した場合、異なるストリームからのフラッシュを異なる順序で処理できることです。

私のプログラムでこれが発生しました。2 つの通常のメッセージの間にエラー メッセージが表示されましたが、どちらもエラー メッセージが表示される前にフラッシュされました。

2 つのストリームを同期する組み込みの方法はありますか? それとも手動で処理する必要がありますか?

于 2010-11-17T01:03:19.557 に答える
7

System.out/System.err「深刻な」使用の場合、宛先をハードコーディングし、かなり風変わりなものを使用するため、に直接書き込むことはお勧めしませんPrintStream(バイトストリームですか、それとも文字ストリームですか?)。出力ストリームを独自の でラップする場合は、PrintWriter自動的にフラッシュするように設定できます。コンストラクターの 2 番目の引数はauto-flush.

例えば

PrintWriter out = new PrintWriter(System.out, true);
PrintWriter err = new PrintWriter(System.err, true);

out.println("Hello world");
//this will flush after writing the end of line

見る

于 2010-05-24T12:43:15.313 に答える
3

System.out と System.err は通常のPrintStreamオブジェクト (flush() メソッドを提供する) であるため、 と を試してSystem.out.flush()くださいSystem.err.flush()

于 2010-05-24T12:23:16.397 に答える
0

フラッシュを追加してから を追加するとThread.sleep(1)、99.9% の出力順序が正しくなります。

たとえば、これは期待どおりに表示されます。

System.out.println( "stdout 1" ); System.out.flush(); Thread.sleep( 1 );
System.err.println( "stderr 1" ); System.err.flush(); Thread.sleep( 1 );
System.out.println( "stdout 2" ); System.out.flush(); Thread.sleep( 1 );
System.err.println( "stderr 2" ); System.err.flush(); Thread.sleep( 1 );

唯一の欠点は、1 ミリ秒、つまり 1/1000 秒のスリープです。

于 2012-05-08T20:32:11.907 に答える