違いは何であるPrintStream
とはPrintWriter
?これら2つのクラスをよく混同するため、共通のメソッドがたくさんあります。また、まったく同じものに使えると思います。しかし、違いがなければなりません。そうでなければ、1つのクラスしかなかっただろう。
アーカイブを検索しましたが、この質問は見つかりませんでした。
違いは何であるPrintStream
とはPrintWriter
?これら2つのクラスをよく混同するため、共通のメソッドがたくさんあります。また、まったく同じものに使えると思います。しかし、違いがなければなりません。そうでなければ、1つのクラスしかなかっただろう。
アーカイブを検索しましたが、この質問は見つかりませんでした。
回答:
これは軽快に聞こえるかもしれませんが、にPrintStream
印刷され、OutputStream
にPrintWriter
印刷されますWriter
。わかりました、私が明白を述べるために私がポイントを得ることを疑います。しかし、それだけではありません。
では、an OutputStream
とaの違いは何Writer
ですか?どちらもストリームです。主な違いは、a OutputStream
がバイトのストリームであるのに対し、a Writer
は文字のストリームです。
OutputStream
バイトを扱う場合はどうPrintStream.print(String)
ですか?デフォルトのプラットフォームエンコーディングを使用して文字をバイトに変換します。特に1つのプラットフォームでファイルを生成し、別のプラットフォームでそれを使用している場合は、デフォルトのエンコーディングを使用すると、プラットフォーム間を移動するときにバグが発生する可能性があるため、一般に悪いことです。
では、Writer
通常、使用するエンコーディングを指定して、プラットフォームの依存関係を回避します。
PrintStream
主な目的はバイトではなく文字を書き込むことなので、JDKにaが含まれているのはなぜですか。PrintStream
は、Reader / Writer文字ストリームが導入されたJDK 1.1より前のバージョンです。Sun PrintStream
があまりにも広く使われているという事実さえあれば、Sunは非推奨になると思います。(結局のところ、呼び出しごとにSystem.out
非推奨のAPI警告を生成する必要はありません!また、標準出力ストリームでタイプをからPrintStream
に変更すると、PrintWriter
既存のアプリケーションが破損します。)
PrintStream
、プラットフォームのデフォルトのエンコーディングの使用に限定されていません。文字セット名を受け入れるコンストラクタがあります。したがって、との違いはPrintStream
、PrintWriter
はPrintWriter
生のバイトを書き込めず、2つのクラスは異なるタイプの宛先をラップすることです。
PrintStream
のprint()
メソッドを効果的に共有する一方で、有効にwrite()
なっていると自動フラッシュをトリガーするので、それらを呼び出す便利な関数です。PrintWriter
一方、への呼び出し後は自動フラッシュされませんprint()
。私は今日、Javaの初心者をデモしてきましたが、これは手動でフラッシュする必要性に慣れていない一部の学生を引き付けていました。そうでなければあなたの答えは素晴らしいです。
ではPrintStream
、あなたはプラットフォームのデフォルトのエンコーディングに立ち往生しています。
PrintStream stream = new PrintStream(output);
ではPrintWriter
、あなたはしかし渡すことができOutputStreamWriter
、特定のエンコードで。
PrintWriter writer = new PrintWriter(new OutputStreamWriter(output, "UTF-8"));
利点は、文字が最終的にmojibakeにならないように、文字を書き込む文字エンコードを制御できることです。
PrintStream(OutputStream out, boolean autoFlush, String encoding)
PrintWriterのようなライターはテキスト出力用であり、ストリームはバイナリ出力用です。ライターが文字セットを処理します。ストリームはそうではありません。バイナリデータがめちゃくちゃになり、そうした場合はライターを使用するような変換はしたくないと想定されているからです。
未加工のバイトは、ライターではなくストリームに書き込むことができます。PrintWriterのjavadocリスト他の相違点(最も重要なのは、それは私が言うと思います生のバイトを解釈できるように、ストリームのエンコードを設定することが可能です)。
HorstmannによるコアJavaから
Javaのベテランは、PrintStreamクラスとSystem.outに何が起こったのか疑問に思うかもしれません。Java 1.0では、PrintStreamクラスは、先頭バイトを削除することにより、すべてのUnicode文字をASCII文字に切り捨てました。(当時、Unicodeは依然として16ビットエンコーディングでした。)明らかに、これはクリーンでポータブルなアプローチではなく、Java 1.1でのリーダーとライターの導入により修正されました。既存のコードとの互換性のために、System.in、System.out、およびSystem.errは引き続き入出力ストリームであり、リーダーおよびライターではありません。しかし、PrintStreamクラスは、PrintWriterが行うのと同じ方法で、Unicode文字をデフォルトのホストエンコーディングに内部的に変換するようになりました。PrintStreamタイプのオブジェクトは、printおよびprintlnメソッドを使用する場合、印刷ライターとまったく同じように動作します。