4

PrintWriter次のコンストラクターのコントラクトを見ると:

public PrintWriter(OutputStream out, boolean autoFlush)

PrintWriter既存の から新しい を作成しますOutputStream。この便利なコンストラクターはOutputStreamWriter、デフォルトの文字エンコーディングを使用して文字をバイトに変換するために必要な中間体を作成します。

パラメータ:
out- 出力ストリーム
autoFlush- A boolean; if trueprintlnprintf、またはformatメソッドは出力バッファをフラッシュします

関連項目: OutputStreamWriter.OutputStreamWriter(java.io.OutputStream)

autoFlushフラグはprintlnprintf、および でのみ機能することに注意してくださいformat。今、私はそれを知ってprintfおり、基本的にはより多くのオプションを除いてformatまったく同じことを行いますが、なぜそれらが契約に含まれていないのかわかりません. なぜ彼らはこの決定を下したのですか?printprint

4

1 に答える 1

3

これは、Java の作成者がパフォーマンスについて次のように仮定しているためだと思われます。

次のコードを検討してください。

public static void printArray(int[] array, PrintWriter writer) {
    for(int i = 0; i < array.length; i++) {
        writer.print(array[i]);
        if(i != array.length - 1) writer.print(',');
    }
}

flush()ほとんどの場合、そのようなメソッドを呼び出しのたびに呼び出すことは望ましくありません。特に大規模な配列の場合、パフォーマンスが大幅に低下する可能性があります。そして、何らかの理由でそれが必要な場合は、自分自身を と呼ぶ ことができます。flush

printfformat、 およびメソッドはprintln、大量のテキストを一度に出力する可能性が高いため、すべての後にフラッシュするのが理にかなっています。しかし、たった 1 文字または数文字の後にフラッシュする意味があったとしても、めったにありません。


いくつかの検索の後、私はこの推論の引用を見つけました(強調は私のものです):

これまで見てきた例のほとんどは、バッファリングされていない I/O を使用しています。これは、各読み取りまたは書き込み要求が、基盤となる OS によって直接処理されることを意味します。これにより、プログラムの効率が大幅に低下する可能性があります。これは、このような各要求が、ディスク アクセス、ネットワーク アクティビティ、または比較的コストのかかるその他の操作をトリガーすることが多いためです。

この種のオーバーヘッドを削減するために、Java プラットフォームはバッファリングされた I/O ストリームを実装しています。バッファリングされた入力ストリームは、バッファと呼ばれるメモリ領域からデータを読み取ります。ネイティブ入力 API は、バッファーが空の場合にのみ呼び出されます。同様に、バッファリングされた出力ストリームはデータをバッファに書き込み、ネイティブ出力 API はバッファがいっぱいになった場合にのみ呼び出されます。

<中略>

バッファーがいっぱいになるのを待たずに、重要なポイントでバッファーを書き出すことが理にかなっていることがよくあります。これは、バッファのフラッシュとして知られています。

一部のバッファー出力クラスは、オプションのコンストラクター引数で指定された autoflush をサポートしています。autoflush が有効になっている場合、特定のキー イベントによってバッファがフラッシュされます。たとえば、 autoflushオブジェクトは、またはPrintWriterを呼び出すたびにバッファをフラッシュします。printlnformat

于 2015-04-20T18:11:56.113 に答える