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?
Antworten:
Streams (
InputStream
undOutputStream
) ü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 derString.getBytes(Charset)
Methode tun , aber Sie sollten dieString.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 aPrintWriter
) zu verpacken , das die Konvertierung für Sie durchführt, wenn Sie seinewrite(String)
(oderprint(String)
) Methode aufrufen . Der entsprechende Wrapper für InputStreams ist ein Reader .PrintStream
ist eine spezielleOutputStream
Implementierung 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 einePrintStream
oder eine andere Stream-Implementierung handelt. Es besteht keine Gefahr einer Doppelkodierung.Beispiel für PrintWriter mit OutputStream:
quelle
PrintWriter
ist also genau wie VerwendenString.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.OutputStream schreibt Bytes, String liefert Zeichen. Sie müssen einen Zeichensatz definieren, um die Zeichenfolge in Byte [] zu codieren:
Wechseln Sie
UTF-8
zu einem Zeichensatz Ihrer Wahl.quelle
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
Sie können einen PrintStream erstellen, der Ihren OutputStream umschließt, und dann einfach print (String) aufrufen:
quelle
Mit Absicht ist dies folgendermaßen zu tun:
quelle
w.close()
wirdout
.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.
quelle
Sie können Apache Commons IO verwenden :
quelle
IOUtils.write(String data, OutputStream output, Charset encoding)
wird als implementiertoutput.write(data.getBytes(Charsets.toCharset(encoding)))
, so kann es sein, wenn eine codierte Zeichenfolge nicht in ein Byte-Array passen kann