Ich denke, dass die anderen Antworten einen wichtigen Punkt / eine wichtige Frage vermissen.
Sollten Sie wirklich einen OutputStream verwenden?
Die Klassenhierarchien OutputStream
und InputStream
sind zum Schreiben und Lesen von byte-orientierten Daten gedacht. Aber Java Strings sind nicht byte-orientiert. Sie sind zeichenorientiert (zum ersten Annäherung), und Zeichen in Java sind 16-Bit-Unicode-Codeeinheiten.
Wenn Sie Zeichen in einen Byte-Stream schreiben, muss die JVM eine Konvertierung durchführen, um die Zeichen als Bytes zu kodieren. Tatsächlich gibt es viele mögliche Wege, dies zu tun. Zum Beispiel wird UTF-8 jedes Zeichen in der Sequenz als ein oder mehrere Bytes kodieren, Latin-1 oder ASCII werden eine Untermenge von Zeichen als einzelne Bytes kodieren und andere in (wahrscheinlich) Fragezeichen umwandeln. Und so weiter.
Es ist jedoch möglich, etwas wie dies zu schreiben:
public void print(String s){
o.write(s.getBytes());
}
aber es hat ein Problem. Das Problem ist, dass die getBytes()
-Methode auf einem String
das Standardzeichencodierungsschema der JVM verwendet, um die Konvertierung durchzuführen. Und dies (das Standardzeichencodierungsschema) hängt von der Umgebung ab, in der die JVM gestartet wurde. Dieser Code macht also je nach Umgebung unterschiedliche Dinge. Sie könnten das beheben, indem Sie den Charset angeben:
public void print(String s){
o.write(s.getBytes("UTF-8"));
}
aber das wird umständlich, wenn Sie getBytes an vielen Stellen aufrufen.
Wenn Sie viele textbasierte Ausgaben machen, ist es eine bessere Idee, das Writer
-API anstelle des OutputStream
-API zu verwenden. Das Writer
-API und dessen Implementierungen behandeln die Konvertierung intern ... und konsistenter und effizienter.
Der letzte Punkt ist, dass es andere APIs gibt, die hilfreich sein können, um textbasierte Ausgaben zu erstellen.
- Die Klasse
BufferedWriter
(und auch BufferedOutputStream
) unterstützen effiziente Ausgabe, indem sie ein In-Memory-Buffering in den Ausgabeprozess einführen. Dies spart Systemaufrufe, insbesondere wenn Sie viele kleine Schreiboperationen durchführen.
- Die Klasse
PrintWriter
bietet eine Vielzahl von Komfortmethoden und entfernt auch die Notwendigkeit, IOExceptions zu behandeln. (Wenn eine IOException auftritt, macht der PrintWriter
eine Notiz davon. Es gibt eine Methode zum Testen, ob eine Ausnahme aufgetreten ist. Dies kann nützlich oder gefährlich sein, je nachdem, was Sie tun ...)