101 Stimmen

Wie konvertiert man einen Reader in einen InputStream und einen Writer in einen OutputStream?

Gibt es eine einfache Möglichkeit, Probleme mit der Textkodierung zu vermeiden?

96voto

Ritesh Tendulkar Punkte 977

Wenn Sie mit einem String beginnen, können Sie auch Folgendes tun:

new ByteArrayInputStream(inputString.getBytes("UTF-8"))

10 Stimmen

Gut ReaderInputStream Implementierung würde weniger Speicher benötigen - es sollte nicht notwendig sein, alle Bytes in einem Array auf einmal zu speichern.

4 Stimmen

Ich mag diese Lösung, denn sie funktioniert, wenn Sie Code testen müssen, der Eingaben über (z. B.) die Standardeingabe akzeptiert.

51voto

Peter Punkte 5563

Sie können die Probleme mit der Textkodierung nicht wirklich vermeiden, aber es gibt bereits Lösungen in Apache Commons:

Sie müssen nur die Kodierung Ihrer Wahl auswählen.

7 Stimmen

Zu Ihrer Information: Der ReaderInputStream-Code hat einen Fehler in der Art und Weise, wie er Bytes liest (er funktioniert nicht bei allen Kodierungen). Beweis: illegalargumentexception.blogspot.com/2009/05/ Es gibt eine offene Wanze: issues.apache.org/bugzilla/show_bug.cgi?id=40455

1 Stimmen

Sie finden die Klassen in der Commons-io-Bibliothek des Apache: commons.apache.org/proper/commons-io

1 Stimmen

@McDowell, der von Ihnen erwähnte Fehler liegt in der Implementierung von Apache Ant, nicht in der von commons-io, ist also für diese Antwort nicht relevant.

48voto

Peter Ford Punkte 573

Nun, ein Reader befasst sich mit Zeichen und ein InputStream mit Bytes. Die Kodierung gibt an, wie Sie Ihre Zeichen als Bytes darstellen möchten, also können Sie das Problem nicht wirklich ignorieren. Was die Vermeidung von Problemen, meine Meinung ist: Wählen Sie einen Zeichensatz (z. B. "UTF-8") und bleiben Sie mit ihm.

Was die eigentliche Vorgehensweise betrifft, so wurde bereits darauf hingewiesen, dass " die offensichtlichen Namen für diese Klassen sind ReaderInputStream y WriterOutputStream . " Überraschenderweise, " diese sind nicht in der Java-Bibliothek enthalten ", auch wenn die "gegenteiligen" Klassen, InputStreamReader y OutputStreamWriter sind enthalten.

Daher haben viele Leute ihre eigenen Implementierungen entwickelt, darunter Apache Commons IO . Je nach Lizenzbedingungen können Sie die commons-io-Bibliothek wahrscheinlich in Ihr Projekt einbinden oder sogar einen Teil des Quellcodes kopieren (der heruntergeladen werden kann aquí ).

Wie Sie sehen können, besagt die Dokumentation beider Klassen, dass "alle von der JRE unterstützten Zeichensatzkodierungen korrekt behandelt werden".

N.B. In einem Kommentar zu einer der anderen Antworten hier wird erwähnt dieser Fehler . Aber das betrifft den Apache Ameise ReaderInputStream-Klasse ( aquí ), no der Apache Commons IO ReaderInputStream-Klasse.

19voto

Phil Harvey Punkte 1150

Beachten Sie auch, dass Sie, wenn Sie mit einem String beginnen, die Erstellung eines StringReaders überspringen und einen InputStream in einem Schritt mit org.apache.commons.io.IOUtils von Commons IO etwa so:

InputStream myInputStream = IOUtils.toInputStream(reportContents, "UTF-8");

Natürlich müssen Sie sich immer noch Gedanken über die Textkodierung machen, aber zumindest erfolgt die Umwandlung in einem Schritt.

5 Stimmen

Diese Methode bewirkt im Wesentlichen new ByteArrayInputStream(report.toString().getBytes("utf-8")) was die Zuweisung von zwei zusätzlichen Kopien des Berichts im Speicher beinhaltet. Wenn der Bericht groß ist, ist er schlecht. Siehe meine Antwort.

11voto

Oliv Punkte 9469

Verwendung:

new CharSequenceInputStream(html, StandardCharsets.UTF_8);

Dieser Weg erfordert keine vorherige Umstellung auf String und dann an byte[] , die viel mehr Heap-Speicher zuweist, falls der Bericht groß ist. Die Konvertierung in Bytes erfolgt während des Lesens des Streams direkt aus dem StringBuffer.

Sie verwendet CharSequenceInputStream aus dem Apache Commons IO-Projekt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X