Wie ein Reader INPUTSTREAM- und ein Writer Output konvertieren?
Frage
Gibt es eine einfache Möglichkeit, den Umgang mit Textcodierung Probleme zu vermeiden?
Lösung
Sie können nicht wirklich vermeiden mit der Textcodierung Fragen beschäftigen, aber es gibt bestehende Lösungen:
-
Reader
InputStream
:ReaderInputStream
-
Writer
OutputStream
:WriterOutputStream
Sie müssen nur die Codierung Ihrer Wahl wählen.
Andere Tipps
Wenn Sie beginnen mit einem String-off Sie auch folgendes tun:
new ByteArrayInputStream(inputString.getBytes("UTF-8"))
Nun, ein Reader beschäftigt sich mit Zeichen und ein Input beschäftigt sich mit Bytes. Die Codierung gibt an, wie Sie Ihre Zeichen als Bytes repräsentieren, so dass Sie das Problem nicht wirklich ignorieren. Wie zur Vermeidung von Problemen, meiner Meinung nach ist: mit ihm ein charset (z „UTF-8“) und halten wählen.
In Bezug auf, wie man es wirklich tun, als darauf hingewiesen wurde, " die offensichtlichen Namen für diese Klassen sind ReaderInputStream und WriterOutputStream . " überraschenderweise, obwohl die 'entgegengesetzte' Klassen " diese sind nicht in der Java-Bibliothek enthalten", Input und Output sind enthalten.
So viele Menschen haben mit ihren eigenen Implementierungen kommen, einschließlich Apache Commons IO . Je nach Lizenzfragen, werden Sie wahrscheinlich in der Lage sein, die commons-io-Bibliothek in einem Projekt gehört, oder sogar einen Teil des Quellcodes kopieren (die herunterladbaren ist hier ).
- Apache ReaderInputStream: API / Quellcode Link
- Apache WriterOutputStream: API / Quellcode Link
Wie Sie sehen können, Dokumentation beiden Klassen, heißt es, dass ‚alle charset Codierungen von der JRE unterstützt werden korrekt behandelt‘.
N. B. Ein Kommentar zu einem der anderen Antworten hier erwähnt diesen Fehler . Aber das wirkt sich auf die Apache Ant ReaderInputStream Klasse ( hier ) nicht die Apache Commons IO ReaderInputStream Klasse.
Auch zur Kenntnis, dass, wenn Sie mit einem String Anfahren sind, können Sie ein String Erstellen überspringen und einen Inputstream in einem Schritt erstellen org.apache.commons.io.IOUtils von Commons IO wie folgt:
InputStream myInputStream = IOUtils.toInputStream(reportContents, "UTF-8");
Natürlich müssen Sie noch über die Textkodierung denken, aber zumindest die Umwandlung in einem Schritt geschieht.
Verwendung:
new CharSequenceInputStream(html, StandardCharsets.UTF_8);
Auf diese Weise zu String
nicht eine Vorauszahlung Umwandlung erfordert und dann byte[]
, welche Speicher viel mehr Heap reserviert, falls der Bericht groß. Er wandelt auf Bytes on the fly als der Strom gelesen wird, direkt von dem String.
Es verwendet CharSequenceInputStream von Apache Commons IO-Projekt.
Die offensichtlichen Namen für diese Klassen sind ReaderInputStream und WriterOutputStream. Leider gibt es in der Java-Bibliothek diese sind nicht enthalten. Doch Google ist dein Freund.
Ich bin nicht sicher, dass sie alle Textcodierung Probleme umgehen, werden, der alptraum sind.
Es gibt eine RFE, aber es ist geschlossen, nicht beheben .
Sie können nicht zur Textcodierung Probleme vermeiden, aber Apache commons-io hat
Beachten Sie das sind die Bibliotheken von koders.com in Peters Antwort genannt sind, nur Links in die Bibliothek anstelle des Quellcodes.
Sind Sie versuchen, den Inhalt eines Reader
zu einem OutputStream
zu schreiben? Wenn ja, werden Sie leichter Einwickeln der OutputStream
in einem OutputStreamWriter
haben und die char
s vom Reader
zum Writer
schreiben, anstatt zu versuchen, den Leser zu einem InputStream
zu konvertieren:
final Writer writer = new BufferedWriter(new OutputStreamWriter( urlConnection.getOutputStream(), "UTF-8" ) );
int charsRead;
char[] cbuf = new char[1024];
while ((charsRead = data.read(cbuf)) != -1) {
writer.write(cbuf, 0, charsRead);
}
writer.flush();
// don't forget to close the writer in a finally {} block
Eine Warnung, wenn WriterOutputStream mit - es nicht immer behandeln binäre Daten in eine Datei zu schreiben richtig / die gleiche wie eine reguläre Ausgabe-Stream. Ich hatte ein Problem mit diesem, das mir einer Weile dauerte bis zu verfolgen.
Wenn Sie können, ich würde empfehlen, einen Ausgangsstrom als Basis verwendet wird, und wenn Sie Strings schreiben müssen, verwenden Sie einen Output Wrapper um den Strom, es zu tun. Es ist viel zuverlässiger Text Bytes als die andere Art und Weise zu konvertieren um, was wahrscheinlich ist, warum WriterOutputStream kein Bestandteil der Standard-Java-Bibliothek ist
Sie können mit Cactoos (keine statischen Methoden, nur Objekte):
Sie können die andere Art und Weise umwandeln um auch:
Für eine Zeichenkette in einem Strom Lesen mit genau dem, was Java liefert.
InputStream s = new BufferedInputStream( new ReaderInputStream( new StringReader("a string")));