サイトを検索していくつかの回答を見つけましたが、これら 2 つのクラスの違いを理解するのに苦労しています。誰かがこれら2つのクラスの違いを説明できますか?
3 に答える
PrintStream
エンコーディング文字やその他のデータ型を処理するための最初のブリッジでした。javadoc を見ると、java.io.OutputStream
2 つの異なるデータ型を書き込むためのメソッドのみが表示されます:byte
とint
.
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
を厳密に扱う抽象クラスを導入しました。char
String
int
PrintWriter
double
、 などの他のタイプのメソッドを追加しますboolean
...
最近では、フォーマット印刷などの/メソッドPrintWriter
もあります...format()
printf()
原則として、文字データを記述する場合はWriter
インスタンスを使用します。バイナリ (または混合) データを作成している場合はOutputStream
、インスタンスを使用します。
PrintWriterの Javadoc から:
オブジェクトのフォーマットされた表現をテキスト出力ストリームに出力します。このクラスは、PrintStream にあるすべての印刷メソッドを実装します。プログラムがエンコードされていないバイトストリームを使用する必要がある生のバイトを書き込むためのメソッドは含まれていません。
このように考えてください: aPrintStream
は some の上に置かれますOutputStream
。出力ストリームは文字ではなくバイトを扱うため、PrintStreamは文字をバイトにエンコードする責任を負う必要があります。OutputStream は「単に」バイトをファイル/コンソール/ソケットに書き込みます。
一方、 APrintWriter
は a の上にありWriter
ます。文字をバイトにエンコードするのは Writer の役割であるため、PrintWriter はエンコードを行いません。私は改行などについて知っているだけです (はい、PrintWriters にはFile
s とOutputStream
s を取るコンストラクターがありますが、それらは単に便利です。たとえば、PrintWriter(OutputStream)
.
自動行フラッシュなしで、既存の OutputStream から新しい PrintWriter を作成します。この便利なコンストラクターは、デフォルトの文字エンコーディングを使用して文字をバイトに変換する、必要な中間 OutputStreamWriter を作成します。
ところで、PrintWriter
あまりユーティリティがないと思われる場合は、PrintWriter と PrintStream の両方IOException
が印刷ロジックから s を吸収することを思い出してください。
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
/ OutputStream
vsから継承され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 クラスを削除することはできませんでした。