2010-05-12 10 views
112

Was ist der Unterschied zwischen PrintStream und PrintWriter? Sie haben viele Methoden gemeinsam, aufgrund derer ich diese beiden Klassen oft vermische. Außerdem denke ich, dass wir sie für genau die gleichen Dinge verwenden können. Aber es muss einen Unterschied geben, sonst hätte es nur eine Klasse gegeben.Java: Unterschied zwischen PrintStream und PrintWriter

Ich habe die Archive durchsucht, konnte aber diese Frage nicht finden.

+1

+1 Gute Frage, ich verwechsle auch diese beiden Klassen, und die API Doc hilft auch nicht viel. – helpermethod

+0

Ein weiterer Unterschied ist, wie Autoflush funktioniert. Bei einem Writer löst das Vorhandensein eines \ n-Zeichens in der Ausgabe flush() aus. Aber in einem Bytestrom (PrintStream) gibt es nur Bytes. autoflush funktioniert dann wie in Javadoc beschrieben, basierend auf: "plattformeigenen Vorstellung von Zeilentrennzeichen anstelle von Zeilenvorschubzeichen". – mins

Antwort

117

Dies klingt vielleicht frivol, aber PrintStream druckt auf OutputStream, und PrintWriter druckt auf Writer. Ok, ich bezweifle, dass ich irgendwelche Punkte dafür bekomme, das Offensichtliche zu sagen. Aber da ist noch mehr.

Also, was ist der Unterschied zwischen einem OutputStream und einem Writer? Beide sind Streams, mit dem primären Unterschied, dass ein OutputStream ist ein Strom von Bytes, während ein Writer ist ein Strom von Zeichen.

Wenn eine OutputStream mit Bytes handelt, was ist mit PrintStream.print(String)? Er konvertiert Zeichen mithilfe der Standard-Plattformcodierung in Bytes. Die Verwendung der Standardcodierung ist im Allgemeinen eine schlechte Sache, da sie beim Wechsel von einer Plattform zu einer anderen zu Fehlern führen kann, insbesondere wenn Sie die Datei auf einer Plattform erstellen und auf einer anderen Plattform konsumieren.

Bei einer Writer geben Sie normalerweise die zu verwendende Codierung an und vermeiden jegliche Plattformabhängigkeiten.

Warum brauchen Sie eine PrintStream im JDK, da die primäre Absicht ist, Zeichen zu schreiben, und nicht Bytes? PrintStream ist älter als JDK 1.1, wenn Reader/Writer-Zeichenströme eingeführt wurden. Ich stelle mir vor, Sun hätte PrintStream veraltet, wenn nur für die Tatsache, dass es so weit verbreitet ist. (Immerhin würden Sie nicht jeden Aufruf System.out wollen eine veraltete api Warnung zu generieren! Auch hätte die Art PrintStream-PrintWriter auf den Standard-Ausgabeströme Änderung bestehender Anwendungen gebrochen.)

+2

Das habe ich mir auch gedacht - aber das stimmt nicht. Sogar PrintStream verwaltet einen Writer unter der Haube - wenn Sie ihm einen OutputStream übergeben, wird er umgebrochen. –

+2

@Jon - intern gibt es einen Writer, aber es schreibt in einen OutputStream, also ist der Nettoeffekt, dass ein PrintStream in einen OutputStream schreibt - Char-to-Byte-Konvertierung passiert und verwendet die Standard-Plattform-Codierung. Es gibt keine solche Anforderung für char-> byte-Konvertierung in einem PrintWriter, Sie können den ganzen Weg mit Zeichen bleiben. – mdma

+0

"Der Standardzeichensatz wird beim Start der virtuellen Maschine ermittelt und hängt normalerweise von der Ländereinstellung und dem Zeichensatz des zugrunde liegenden Betriebssystems ab.", Auch Locale ändert den Standardzeichensatz auf einigen Plattformen. – Pindatjuh

3

Schriftsteller wie Printwriter sind für Textausgabe, Streams sind für die binäre Ausgabe. Die Autoren verarbeiten Zeichensatz für Sie. Streams nicht, weil angenommen wird, dass Sie diese Art von Konvertierung nicht möchten, die Ihre Binärdaten durcheinander bringen würde, und wenn Sie einen Writer verwenden würden.

+1

Mit Ausnahme von PrintStream, weil der eine Codierung nimmt, damit es ein wenig mehr als ein Standard-OutputStream verarbeiten kann. –

+0

klingt komisch, dass System.out, das einzige Ziel ist das Drucken von Zeichenfolgen, ist eigentlich ein PrintStream. – mins

+0

"Die Autoren verarbeiten Zeichensatz für Sie" - nur die Writer, die sich mit der Umwandlung von Zeichen in Bytes befassen. Nicht alle Autoren tun es. – Aivar

2

Sie können rohe Bytes in einen Stream und nicht in einen Writer schreiben. Die PrintWriter javadoc listet die anderen Unterschiede auf (am wichtigsten ist es, eine Codierung in einem Stream festlegen zu können, damit sie die rohen Bytes interpretieren kann, die ich sagen würde).

+0

Mit PrintStream kann man auch die Kodierung – Aivar

58

Mit der PrintStream Sie stecken auf Standard-Codierung der Plattform.

PrintStream stream = new PrintStream(output); 

Mit dem PrintWriter können Sie jedoch eine OutputStreamWriter mit einer bestimmten Codierung übergeben.

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

Der Vorteil ist, na ja, dass Sie die Zeichen die Zeichen codiert, steuern kann, sollte in einer solchen geschrieben werden, dass sie nicht schließlich als mojibake enden.

+38

+1 für das Unterrichten eines neuen Wortes angeben, mojibake :) – Jonik

+7

Seit 1.4, gibt es einen neuen Konstruktor für PrintStream, der die Codierung 'PrintStream (OutputStream out, boolean autoFlush, String encoding)' – artbristol

+0

dankt! - Ich habe genau nach einer Möglichkeit gesucht, auf ein Byte-Array mit einer bestimmten Codierung zu drucken. –

17

Seit JDK 1.4 ist es möglich, die Zeichencodierung für einen PrintStream anzugeben. Die Unterschiede zwischen PrintStream und PrintWriter betreffen also nur das automatische Löschverhalten, und ein PrintStream kann einen Writer nicht umbrechen.

-1

Printwriter ist eine Erweiterung von printstream.

I.E. Printstream für einen bestimmten Zweck.