29

サイトを検索していくつかの回答を見つけましたが、これら 2 つのクラスの違いを理解するのに苦労しています。誰かがこれら2つのクラスの違いを説明できますか?

4

3 に答える 3

25

PrintStreamエンコーディング文字やその他のデータ型を処理するための最初のブリッジでした。javadoc を見ると、java.io.OutputStream2 つの異なるデータ型を書き込むためのメソッドのみが表示されます:byteint.

JDK (1.0.x) の初期のバージョンでは、文字を書きたい場合、次の 2 つのいずれかを行うことができました。出力ストリームにバイトを書き込むことです (システムのデフォルトの文字セットにあると想定されています)。

outputStream.write("foobar".getBytes());

または別のものをラップoutputStreamしますPrintStream

PrintStream printStream = new PrintStream(outputStream);
printStream.write("foobar");

違いを見ます? PrintStreamバイトへの文字変換とエンコードを処理します (上記のコンストラクター呼び出しはシステムの既定のエンコードを使用しますが、パラメーターとして渡すこともできます)。doubleまた、boolean、 などを書くための便利なメソッドも提供します。

実際System.out、 とはインスタンスSystem.errとして定義されています。PrintStream

JDK 1.1 が登場し、PrintStream書き込み用のバイト ベースのメソッドがまだ残っているため、純粋な文字データを処理するためのより良い方法が必要であることに気付きました。そこで、、 、およびデータWriterを厳密に扱う抽象クラスを導入しました。charStringint

PrintWriterdouble、 などの他のタイプのメソッドを追加しますboolean...

最近では、フォーマット印刷などの/メソッドPrintWriterもあります...format()printf()

原則として、文字データを記述する場合はWriterインスタンスを使用します。バイナリ (または混合) データを作成している場合はOutputStream、インスタンスを使用します。

于 2012-07-07T06:09:07.393 に答える
10

PrintWriterの Javadoc から:

オブジェクトのフォーマットされた表現をテキスト出力ストリームに出力します。このクラスは、PrintStream にあるすべての印刷メソッドを実装します。プログラムがエンコードされていないバイトストリームを使用する必要がある生のバイトを書き込むためのメソッドは含まれていません。

このように考えてください: aPrintStreamは some の上に置かれますOutputStream。出力ストリームは文字ではなくバイトを扱うため、PrintStreamは文字をバイトにエンコードする責任を負う必要があります。OutputStream は「単に」バイトをファイル/コンソール/ソケットに書き込みます。

一方、 APrintWriterは a の上にありWriterます。文字をバイトにエンコードするのは Writer の役割であるため、PrintWriter はエンコードを行いません。私は改行などについて知っているだけです (はい、PrintWriters にはFiles とOutputStreams を取るコンストラクターがありますが、それらは単に便利です。たとえば、PrintWriter(OutputStream).

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

ところで、PrintWriterあまりユーティリティがないと思われる場合は、PrintWriter と PrintStream の両方IOExceptionが印刷ロジックから s を吸収することを思い出してください。

于 2012-07-07T05:46:45.497 に答える
3

Matt の回答を追加するには:

比較PrintStreamしてPrintWriter、最も便利な部分は、コンストラクターと、print()、println()、printf()/format()関数が両方のクラスでサポートされていることです。ClassName(String fileName, String charsetName)

違いは次のとおりです。

JDK1.0対以来JDK1.1

コンストラクター:

PrintStream(OutputStream out, boolean autoFlush, String charsetName)
PrintWriter(Writer wr)
PrintWriter(Writer wr, boolean autoFlush)

メソッドはFilterOutputStream/ OutputStreamvsから継承されWriterています。違いは vs に要約されbyteますchar

PrintStream.write(byte[] buffer, int offset, int count)
PrintStream.write(byte[] buffer)
PrintStream.write(int oneByte)

PrintWriter.write(int oneChar)
PrintWriter.write(char[] buf)
PrintWriter.write(char[] buf, int offset, int count)
PrintWriter.write(String str)
PrintWriter.write(String str, int offset, int count)

PrintStream.printf()に対応PrintWriter.format()

それは確かに1.1のように見えます。彼らはより良いクラスを考え出しましたが、既存のプログラムを破壊せずに古い 1.0 クラスを削除することはできませんでした。

于 2015-03-20T12:23:47.553 に答える