Der Unterschied PrintStream vs. PrintWriter
Der Unterschied ist, dass PrintStream
in einen Stream
schreibt und PrintWriter
in einen Writer
. Die eigentliche Frage lautet also: was ist der Unterschied zwischen einem Stream
und einem Writer
.
Inhaltsverzeichnis
Der Unterschied zwischen einem Stream
und einem Writer
Der Unterschied ist, dass ein Stream
eine Folge von Bytes ist und ein Writer
eine Folge von Zeichen. Die Hintergründe sind eher historischer Natur, dennoch kann man folgende Empfehlung geben:
>Wenn Zeichenfolgen geschrieben werden sollen und keine explizite Charset Umwandlung notwendig ist, soll PrintWriter
verwendet werden. Wenn Zeichenfolgen in einen OutputStream
mit einem spezifischen Charset geschrieben werden soll, ist PrintStream
die richtige Wahl.
Hintergrund dafür ist, dass PrintStream
einen Konstruktor zur Verfügung stellt, der einen OutputStream
und ein Encoding entgegen nimmt. Der Konstruktor von PrintWriter
nummt nur dann ein Encoding entgegen, wenn ein File
oder ein Pfad spezifiziert wird.
Konstruktoren mit expliziter Charset-Angabe:
PrintStream(File file, String csn)
Creates a new print stream, without automatic line flushing, with the specified file and charset.PrintStream(OutputStream out, boolean autoFlush, String encoding)
Creates a new print stream.PrintStream(String fileName, String csn)
Creates a new print stream, without automatic line flushing, with the specified file name and charset.PrintWriter(File file, String csn)
Creates a new PrintWriter, without automatic line flushing, with the specified file and charset.PrintWriter(String fileName, String csn)
Creates a new PrintWriter, without automatic line flushing, with the specified file name and charset.
Siehe auch die JavaDoc für PrintStream bzw. PrintWriter.
Ein weiterer Unterschied ist, dass wenn automatisches Flushing aktiviert ist, PrintStream
nur bei einem Zeilenumbruch flusht, PrintWriter
aber bei jedem Aufruf von println()
, printf()
und format()
.
Genug Text und Theorie. Hier noch zwei Beispiele:
PrintStream
Beispiel
Auch mit einem PrintStream
können Zeichenketten geschrieben werden.
ByteArrayOutputStream out = new ByteArrayOutputStream();
PrintStream printStream = new PrintStream(out, true, "ISO-8859-1");
printStream.println("öäü?");
System.out.println(Arrays.toString(out.toByteArray()));
// [-10, -28, -4, 63, 13, 10]
out = new ByteArrayOutputStream();
printStream = new PrintStream(out, true, "UTF-8");
printStream.println("öäü?");
System.out.println(Arrays.toString(out.toByteArray()));
// [-61, -74, -61, -92, -61, -68, 63, 13, 10]
Je nach Encoding werden unterschiedliche Bytes in den OutputStream
geschrieben.
PrintWriter
Beispiel
Der PrintWriter bietet die Möglichkeit eines expliziten Encodings gar nicht. Es wird das default Encoding der JVM verwendet:
out = new ByteArrayOutputStream();
PrintWriter printWriter = new PrintWriter(out, true);
printWriter.println("öäü?");
System.out.println(Arrays.toString(out.toByteArray()));
// [-61, -74, -61, -92, -61, -68, 63, 13, 10]
Die Ausgabe ist in diesem Fall die selbe wie bei UTF-8 im obigen Beispiel, weil es sich dabei ums default Encoding der ausführenden JVM handelt. Dies ist aber zufällig und kann natürlich auch ganz anders aussehen. Wenn also das Charset wichtig ist, wie in obiger Regel angeführt PrintStream
verwenden.