ホームページ > Java > &#&チュートリアル > System.out.println および System.err.println の出力が順序どおりに表示されないのはなぜですか?

System.out.println および System.err.println の出力が順序どおりに表示されないのはなぜですか?

Patricia Arquette
リリース: 2024-12-26 07:58:10
オリジナル
920 人が閲覧しました

Why Does System.out.println and System.err.println Output Appear Out of Order?

System.out.println および System.err.println を使用したアウトオブオーダー印刷について

System.out.println を使用する場合および System.err.println を使用すると、これら 2 つのメソッドからの出力が順序どおりに表示されないという予期しない動作が発生する可能性があります。 console.

問題:

提供されたコード内:

public static void main(String[] args) {
    for (int i = 0; i < 5; i++) {
        System.out.println("out");
        System.err.println("err");
    }
}
ログイン後にコピー

出力:

out
out
out
out
out
err
err
err
err
err
ログイン後にコピー

交互の代わりに「out」と「err」の間にある場合、出力にはすべての「out」行とその後にすべての「err」が表示されます。 Lines.

原因:

この動作は、System.out と System.err が異なるストリームであることが原因です。これらのストリームに書き込むと、データは最初にバッファリングされます。バッファされたデータは、次のような特定の時点でのみ実際のコンソール出力に書き込まれます。

  • バッファがいっぱいである。
  • プログラムが終了する。
  • システム.out.flush() または System.err.flush() が呼び出されます。

デフォルトでは、 System.out と System.err は異なる方法でフラッシュされます。 System.out は System.err よりも頻繁にフラッシュされます。したがって、System.out に書き込まれるデータは、System.err に書き込まれるデータより前に表示される傾向があります。

解決策:

出力が「out」と「out」の間で交互になるようにするには「エラー」の場合は、内部で System.out.flush() と System.err.flush() を呼び出すことができます。ループ:

public static void main(String[] args) {
    for (int i = 0; i < 5; i++) {
        System.out.println("out");
        System.err.println("err");
        System.out.flush();
        System.err.flush();
    }
}
ログイン後にコピー

この変更により、出力は期待どおりに交互になります:

out
err
out
err
out
err
out
err
out
err
ログイン後にコピー

以上がSystem.out.println および System.err.println の出力が順序どおりに表示されないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート