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?

yart
quelle
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();
}
MForster
quelle
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.

Peter Knego
quelle
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();
Illarion Kovalchuk
quelle
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
Antonio
quelle
3
Beachten Sie, dass dies ebenfalls geschlossen w.close()wird out.
Franklin Yu
12

Wickeln Sie Ihren OutputStream mit einem PrintWriter ein und verwenden Sie die Druckmethoden für diese Klasse. Sie nehmen einen String auf und erledigen die Arbeit für Sie.

NG.
quelle
9

Sie können Apache Commons IO verwenden :

try (OutputStream outputStream = ...) {
    IOUtils.write("data", outputStream, "UTF-8");
}
Felix
quelle
IOUtils.write(String data, OutputStream output, Charset encoding)wird als implementiert output.write(data.getBytes(Charsets.toCharset(encoding))), so kann es sein, wenn eine codierte Zeichenfolge nicht in ein Byte-Array passen kann
Šarūnas