0

public PrintWriter(OutputStream out, boolean autoFlush) :

out - An output stream
autoFlush - A boolean; if true, the println, printf, or format methods
will flush the output buffer

public PrintStream(OutputStream out, boolean autoFlush) :

out - The output stream to which values and objects will be printed 
autoFlush - A boolean; if true, the output buffer will be flushed 
whenever a byte array is written, one of the println methods is invoked, 
or a newline character or byte ('\n') is written

これらのクラス間で autoflush ロジックを変更した理由は何ですか?

それらはエンコードの瞬間を除いて常に同一と見なされ、フラッシュをオンにせずに「自動フラッシュ」print()することは、驚きを最小限に抑えるという原則にほとんど対応しないため、ばかげたバグが発生
します。自動フラッシュをオンにして PrintWriter を作成しました。なぜ自動フラッシュしないのですか?

4

2 に答える 2

2

その答えは Java の歴史にあると思います。トリオInputStreamOutputStreamおよびPrintStreamin はjava.ioJava 1.0 にさかのぼります。これは、ファイル エンコーディングと文字セットの本格的なサポートが言語に組み込まれる前のことです。

Javadoc を引用するには:

「PrintStream は、別の出力ストリームに機能を追加します。つまり、さまざまなデータ値の表現を便利に印刷する機能です。他にも 2 つの機能が提供されています。他の出力ストリームとは異なり、PrintStream は IOException をスローしません。代わりに、例外的な状況では、単に internal を設定します。 checkError メソッドでテストできるフラグ..."

要約すると、下位レベルの IO の上に移植されたテキスト出力を生成するのに便利です。

Java 1.1 ではReaderWriterPrintWriterが導入されました。これらはすべて文字セットをサポートしています。実際の用途 (生データ処理) はまだありましたが、本質InputStream的に印刷はテキストに関するものであるため、関連性ははるかに低くなりました。OutputStreamPrintStream

Javadoc にはPrintWriter明示的に次のように記載されています。

PrintStream クラスとは異なり、自動フラッシュが有効になっている場合、改行文字がたまたま出力されるたびにではなく、println() メソッドの 1 つが呼び出されたときにのみ行われます。println() メソッドは、改行文字ではなく、プラットフォーム独自の行区切りの概念を使用します。

別の言い方をすれば、PrintWriter はprint*(...)API を介してのみ使用する必要があります。これは、改行文字などを書き込むことは呼び出し元の責任ではないためです。ファイルのエンコーディングと文字セットを処理するのと同じように、呼び出し元の責任ではありません。

PrintWriter代わりにそうすべきjava.io.Printerであり、拡張していないと主張しWriterます。PrintStream彼らが mimic に拡張したのか、それともパイプの設計イディオムを維持することにこだわっていたのかはわかりません。

于 2011-04-01T14:45:05.520 に答える
0

最初から同じにならなかったのは、おそらくただの事故です。現在は下位互換性があります。

于 2011-03-30T21:30:00.280 に答える