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.


Ähnliche Artikel