Schreiben Sie eine Zeichenfolge in den Ausgabestream


139

Ich habe mehrere Ausgabe-Listener, die OutputStream implementieren. Es kann sich entweder um ein PrintStream-Schreiben in stdout oder in eine Datei handeln oder um ein Schreiben in den Speicher oder ein anderes Ausgabeziel. Daher habe ich OutputStream als (ein) Argument in der Methode angegeben.

Jetzt habe ich den String erhalten. Was ist der beste Weg, um hier in Streams zu schreiben?

Sollte ich nur Writer.write (message.getBytes ()) verwenden? Ich kann ihm Bytes geben, aber wenn der Zielstrom ein Zeichenstrom ist, wird er dann automatisch konvertiert?

Muss ich hier stattdessen einige Bridge-Streams verwenden?


2
Ich bin mir nicht sicher, aber das hört sich so an, als würden Sie versuchen, das Rad hier neu zu erfinden. Haben Sie die Java Base-API sowie die Commons IO-API durchgesehen?
Posdef

Antworten:


149

Streams ( InputStreamund OutputStream) übertragen Binärdaten . Wenn Sie einen String in einen Stream schreiben möchten, müssen Sie ihn zuerst in Bytes konvertieren oder mit anderen Worten codieren . Sie können dies manuell (wie Sie vorschlagen) mit der String.getBytes(Charset)Methode tun , aber Sie sollten die String.getBytes()Methode vermeiden , da hierfür die Standardcodierung der JVM verwendet wird, die auf tragbare Weise nicht zuverlässig vorhergesagt werden kann.

Die übliche Methode zum Schreiben von Zeichendaten in einen Stream besteht jedoch darin, den Stream in ein Writer(häufig a PrintWriter) zu verpacken , das die Konvertierung für Sie durchführt, wenn Sie seine write(String)(oder print(String)) Methode aufrufen . Der entsprechende Wrapper für InputStreams ist ein Reader .

PrintStreamist eine spezielle OutputStreamImplementierung in dem Sinne, dass sie auch Methoden enthält, die Zeichenfolgen automatisch codieren (sie verwendet intern einen Writer). Aber es ist immer noch ein Strom. Sie können Ihren Stream sicher mit einem Writer umschließen, unabhängig davon, ob es sich um eine PrintStreamoder eine andere Stream-Implementierung handelt. Es besteht keine Gefahr einer Doppelkodierung.

Beispiel für PrintWriter mit OutputStream:

try (PrintWriter p = new PrintWriter(new FileOutputStream("output-text.txt", true))) {
    p.println("Hello");
} catch (FileNotFoundException e1) {
    e1.printStackTrace();
}

3
Verwenden PrintWriterist also genau wie Verwenden String.getBytes(). Es wird jede zufällige Codierung verwendet, die zufällig die Standardeinstellung der JVM ist. Es funktioniert also nur, wenn Sie Glück haben.
Christoffer Hammarström

106

OutputStream schreibt Bytes, String liefert Zeichen. Sie müssen einen Zeichensatz definieren, um die Zeichenfolge in Byte [] zu codieren:

outputStream.write(string.getBytes(Charset.forName("UTF-8")));

Wechseln Sie UTF-8zu einem Zeichensatz Ihrer Wahl.


3
Mit der folgenden Zeile anhängen. ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
Sahil Patel

32

Sie können einen PrintStream erstellen, der Ihren OutputStream umschließt, und dann einfach print (String) aufrufen:

final OutputStream os = new FileOutputStream("/tmp/out");
final PrintStream printStream = new PrintStream(os);
printStream.print("String");
printStream.close();

2
Welchen Zeichensatz verwendet PrintStream zum Konvertieren in Bytes?
Dean Hiller

20

Mit Absicht ist dies folgendermaßen zu tun:

OutputStream out = ...;
try (Writer w = new OutputStreamWriter(out, "UTF-8")) {
    w.write("Hello, World!");
} // or w.close(); //close will auto-flush

3
Beachten Sie, dass dies ebenfalls geschlossen w.close()wird out.
Franklin Yu


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.