web-dev-qa-db-ja.com

Java:PrintStreamとPrintWriterの違い

PrintStreamPrintWriterの違いは何ですか?それらには多くのメソッドが共通しているため、これら2つのクラスを頻繁に混同しています。さらに、それらをまったく同じ目的に使用できると思います。しかし、違いがなければなりません。そうでなければ、クラスは1つしかなかったでしょう。

アーカイブを検索しましたが、この質問が見つかりませんでした。

121

これは軽快に聞こえるかもしれませんが、PrintStreamOutputStreamに出力され、PrintWriterWriterに出力されます。わかりました、私は私が明白なことを述べるためのポイントを得ることを疑います。しかし、もっとあります。

では、OutputStreamWriterの違いは何ですか?両方ともストリームであり、主な違いはOutputStreamはバイトのストリームであり、Writerは文字のストリームです。

OutputStreamがバイトを処理する場合、PrintStream.print(String)はどうですか?デフォルトのプラットフォームエンコーディングを使用して、文字をバイトに変換します。あるプラットフォームでファイルを生成し、別のプラットフォームでファイルを使用している場合は特に、あるプラットフォームから別のプラットフォームに移動するときにバグにつながる可能性があるため、デフォルトのエンコーディングを使用することは一般に悪いことです。

Writerを使用すると、通常、使用するエンコーディングを指定し、プラットフォームの依存関係を回避します。

主な目的はバイトではなく文字を書くことであるため、なぜJDKにPrintStreamが必要なのでしょうか?リーダー/ライターの文字ストリームが導入されたとき、PrintStreamはJDK 1.1より前のバージョンです。 SunがPrintStreamを非推奨にしたのは、それがそれほど広く使用されているという事実のためだけだと思います。 (結局、System.outへの各呼び出しで非推奨のAPI警告を生成したくないでしょう!また、標準出力ストリームでPrintStreamからPrintWriterに型を変更すると、壊れた既存のアプリケーション。)

125
mdma

PrintStream を使用すると、プラットフォームのデフォルトのエンコーディングに固執します。

PrintStream stream = new PrintStream(output);

PrintWriter を使用すると、特定のエンコードで OutputStreamWriter を渡すことができます。

PrintWriter writer = new PrintWriter(new OutputStreamWriter(output, "UTF-8"));

利点は、文字が最終的に mojibake にならないように、文字のエンコードを制御できることです。

61
BalusC

JDK 1.4以降、PrintStreamの文字エンコーディングを指定できます。したがって、PrintStreamとPrintWriterの違いは、自動フラッシュ動作のみであり、PrintStreamはWriterをラップできません。

17
Renan Mozone

PrintWriterのようなライターはテキスト出力用であり、ストリームはバイナリ出力用です。ライターが文字セットを処理します。ストリームは、バイナリデータを台無しにし、もしそうならライターを使用するような変換を望まないと想定しているため、そうではありません。

3
sblundy

未加工のバイトは、ライターではなくストリームに書き込むことができます。 PrintWriter javadocは、その他の違いをリストします(最も重要なことは、ストリームにエンコードを設定して、私が言う生のバイトを解釈できるようにすることです)。

2

from コアJava Horstmannによる

Javaのベテランは、PrintStreamクラスとSystem.outに何が起こったのか疑問に思うかもしれません。 Java 1.0では、PrintStreamクラスはすべてのUnicode文字をASCII文字に切り捨てて単純に切り捨てました。(当時、Unicodeは16-明らかに、それはクリーンまたは移植性のあるアプローチではなく、Java 1.1。既存のコードとの互換性のために、System.in、System .outおよびSystem.errは、リーダーおよびライターではなく、入力/出力ストリームのままですが、PrintStreamクラスは、PrintWriterと同じ方法で、Unicode文字をデフォルトのホストエンコーディングに内部的に変換します。 printおよびprintlnメソッドを使用する場合、印刷ライターとは異なり、write(int)およびwrite(byte [])メソッドを使用して生バイトを出力できます。

1
nichijou