Gibt es eine einfache Möglichkeit, Probleme mit der Textkodierung zu vermeiden?
Gut ReaderInputStream
Implementierung würde weniger Speicher benötigen - es sollte nicht notwendig sein, alle Bytes in einem Array auf einmal zu speichern.
Gibt es eine einfache Möglichkeit, Probleme mit der Textkodierung zu vermeiden?
Gut ReaderInputStream
Implementierung würde weniger Speicher benötigen - es sollte nicht notwendig sein, alle Bytes in einem Array auf einmal zu speichern.
Sie können die Probleme mit der Textkodierung nicht wirklich vermeiden, aber es gibt bereits Lösungen in Apache Commons:
Reader
a InputStream
: ReaderInputStream
Writer
a OutputStream
: WriterOutputStream
Sie müssen nur die Kodierung Ihrer Wahl auswählen.
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
Sie finden die Klassen in der Commons-io-Bibliothek des Apache: commons.apache.org/proper/commons-io
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.
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.
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 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.