ジャバ:PrintStream と PrintWriter の違い
-
26-09-2019 - |
質問
違いは何ですか PrintStream
そして PrintWriter
?これらには多くの共通のメソッドがあるため、私はこれら 2 つのクラスをよく混同します。しかも、全く同じ用途に使えると思います。しかし、違いがなければなりません。そうでなければ、クラスは 1 つだけになります。
アーカイブを検索しましたが、この質問は見つかりませんでした。
解決
このかもしれない音の軽薄な、しかしPrintStream
にOutputStream
プリント、およびPrintWriter
プリントWriter
へ。 [OK]を、私は明白なことを知らせるための任意のポイントを取得します疑います。しかし、もっとあります。
だから、OutputStream
とWriter
の違いは何ですか?
両方が主な違いは、OutputStream
された状態で、ストリームであるWriter
文字のストリームであるバイトのストリームです。
バイトのOutputStream
お得な情報であれば、どのようなPrintStream.print(String)
でしょうか?これは、デフォルトプラットフォームのエンコーディングを使ってバイトに文字を変換します。デフォルトのエンコーディングを使用すると、別のプラットフォームから移動するとき、それはあなたが一つのプラットフォーム上でファイルを生成し、別の上でそれを消費している場合は特に、バグにつながることができますので、一般的には悪いことです。
Writer
を使用すると、典型的には、任意のプラットフォーム依存性を避け、使用するエンコーディングを指定します。
なぜ、JDKにPrintStream
を持つわざわざ? PrintStream
は、リーダー/ライターの文字ストリームが導入されたJDK 1.1に先行します。私は事実のためにそれがそのように広く使用されている場合は、Sunが非推奨PrintStream
を持って想像します。 (すべての後、あなたはSystem.out
への各呼び出しは推奨されないAPIの警告を生成したくないでしょう!また、標準出力ストリームにPrintStream
にPrintWriter
からタイプを変更すると、既存のアプリケーションが壊れていると思います。)
他のヒント
とともに PrintStream
プラットフォームのデフォルトのエンコーディングにこだわっています。
PrintStream stream = new PrintStream(output);
とともに PrintWriter
ただし、渡すことはできます OutputStreamWriter
特定のエンコーディングを使用します。
PrintWriter writer = new PrintWriter(new OutputStreamWriter(output, "UTF-8"));
利点は、文字が最終的に次のようにならないように、文字を書き込む文字エンコーディングを制御できることです。 文字化け.
はJDK 1.4以降では、PrintStreamのための文字エンコーディングを指定することができます。このように、PrintStreamをとのPrintWriterの違いは唯一、オートフラッシュする行動についてとのPrintStreamはライターをラップすることができないということです。
、ストリームは、バイナリ出力するためのものです。作家はあなたのための文字セットのものを扱います。あなたがやった場合は混乱があなたのバイナリデータをバックアップし、ライターを使用することになります変換のその種を、望んでいないこと、それが想定されますので、ストリームにはありません。
あなたはストリームへとないライターに生のバイトを書き込むことができます。 のPrintWriter のjavadocのリスト他を相違点(最も重要なのは、私は言うだろう、それは生のバイトを解釈できるように、ストリームのエンコードを設定することが可能である)。
からのコアのjava のHorstmann
により、のJavaのベテランはのPrintStreamクラスにし、System.outに起こったものは何でも不思議に思うかもしれません。 Javaでは 1.0、単にドロップでASCII文字にすべてのUnicode文字を切り捨てのPrintStreamクラス トップバイト。 (当時、Unicodeは依然として16ビットのエンコーディングであった。)明らかに、きれいではなかったこと、または ポータブルアプローチは、それは、Java 1.1でのリーダーとライターの導入で固定しました。ために 既存のコードとの互換性は、System.in、のSystem.out、およびSystem.errはまだ入力/出力され ストリームではなく、リーダーやライター。しかし、今のPrintStreamクラスは、内部的にUnicodeに変換します PrintWriterのと同じ方法で、デフォルトのホストエンコーディング文字。型のオブジェクト PrintStreamを使用すると、印刷とprintlnメソッドを使用する場合、正確にプリントライターのように動作しますが、とは異なり、 彼らは、ライト(int型)と書き込み(バイト[])メソッドで出力生のバイトにあなたをできるようにライターを印刷します。
のPrintWriterはのPrintStreamの拡張です。
すなわち。特定の目的のためのPrintStreamます。