これは、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
printf
、format
、 およびメソッドはprintln
、大量のテキストを一度に出力する可能性が高いため、すべての後にフラッシュするのが理にかなっています。しかし、たった 1 文字または数文字の後にフラッシュする意味があったとしても、めったにありません。
いくつかの検索の後、私はこの推論の引用を見つけました(強調は私のものです):
これまで見てきた例のほとんどは、バッファリングされていない I/O を使用しています。これは、各読み取りまたは書き込み要求が、基盤となる OS によって直接処理されることを意味します。これにより、プログラムの効率が大幅に低下する可能性があります。これは、このような各要求が、ディスク アクセス、ネットワーク アクティビティ、または比較的コストのかかるその他の操作をトリガーすることが多いためです。
この種のオーバーヘッドを削減するために、Java プラットフォームはバッファリングされた I/O ストリームを実装しています。バッファリングされた入力ストリームは、バッファと呼ばれるメモリ領域からデータを読み取ります。ネイティブ入力 API は、バッファーが空の場合にのみ呼び出されます。同様に、バッファリングされた出力ストリームはデータをバッファに書き込み、ネイティブ出力 API はバッファがいっぱいになった場合にのみ呼び出されます。
<中略>
バッファーがいっぱいになるのを待たずに、重要なポイントでバッファーを書き出すことが理にかなっていることがよくあります。これは、バッファのフラッシュとして知られています。
一部のバッファー出力クラスは、オプションのコンストラクター引数で指定された autoflush をサポートしています。autoflush が有効になっている場合、特定のキー イベントによってバッファがフラッシュされます。たとえば、 autoflushオブジェクトは、またはPrintWriter
を呼び出すたびにバッファをフラッシュします。println
format