InputStream als UTF-8 lesen

96

Ich versuche text/plain, Zeile für Zeile aus einer Datei über das Internet zu lesen . Der Code, den ich gerade habe, lautet:

URL url = new URL("http://kuehldesign.net/test.txt");
BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
LinkedList<String> lines = new LinkedList();
String readLine;

while ((readLine = in.readLine()) != null) {
    lines.add(readLine);
}

for (String line : lines) {
    out.println("> " + line);
}

Die Datei test.txtenthält ¡Hélló!, die ich zum Testen der Codierung verwende.

Wenn ich das OutputStream( out) überprüfe , sehe ich es als > ¬°H√©ll√≥!. Ich glaube nicht, dass dies ein Problem mit dem ist, OutputStreamda ich out.println("é");ohne Probleme auskommen kann .

Irgendwelche Ideen zum Lesen von InputStreamals UTF-8? Vielen Dank!

Chris Kuehl
quelle
1
Das HTTP-Protokoll gibt die Codierung an. Warum verwenden Sie keine Bibliotheks-API, die das für Sie erledigt? Sie sollten die Codierung niemals so erraten müssen. Ich will nicht negativ sein: Du machst das großartig! Ich frage mich nur, ob es keinen einfacheren Weg gibt.
Tchrist
1
Ich habe text/plainleider keinen Zugriff auf den Server, der die Datei bereitstellt, und er verwendet keine UTF-8-Codierung. Mir waren keine guten Netzwerkbibliotheken bekannt. irgendwelche Vorschläge?
Chris Kuehl
1
Wenn ich mir die Dokumente anschaue , würde ich nicht denken, dass Sie die Codierung überhaupt angeben müssten. Ich bin überrascht, dass sie Ihnen einen Byte-Stream geben! Sie haben Zugriff auf die zugrunde liegende URLConnection , über die Sie die Inhaltscodierung überprüfen und dann einen InputStreamReader mit dem richtigen Argument öffnen können. Eine schnelle Überprüfung der Quelle zeigt nichts, was das für Sie zu tun scheint, was verdammt lahm und fehleranfällig erscheint, also habe ich wahrscheinlich etwas verpasst.
Tchrist

Antworten:

189

Mein eigenes Problem gelöst. Diese Linie:

BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));

muss sein:

BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream(), "UTF-8"));

oder seit Java 7:

BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream(), StandardCharsets.UTF_8));
Chris Kuehl
quelle
3
Ich bin mir ziemlich sicher, dass die Form des Konstruktors bei ungültigen Eingaben keine Ausnahme auslöst. Sie müssen das mit einem CharsetDecoder decArgument verwenden. Dies ist derselbe Java-Designfehler, den die OutputStreamWriterKonstruktoren haben: Nur einer der vier lässt sich tatsächlich herablassen, um Ihnen mitzuteilen, wenn etwas schief geht. Auch dort muss man wieder das ausgefallene CharsetDecoder decArgument verwenden. Das einzig sichere und vernünftige Mittel ist, alle anderen Konstruktoren als veraltet zu betrachten, da ihnen nicht vertraut werden kann, dass sie sich verhalten.
Tchrist
6
Seit Java 7 ist es möglich, den Zeichensatz als Konstante und nicht als String zu schreibenStandardCharsets.UTF_8
tobijdc
18
String file = "";

try {

    InputStream is = new FileInputStream(filename);
    String UTF8 = "utf8";
    int BUFFER_SIZE = 8192;

    BufferedReader br = new BufferedReader(new InputStreamReader(is,
            UTF8), BUFFER_SIZE);
    String str;
    while ((str = br.readLine()) != null) {
        file += str;
    }
} catch (Exception e) {

}

Versuche dies,.. :-)

Rohith
quelle
8
Erstellen Sie anstelle der Datei + = str einen StringBuilder und hängen Sie ihn an. Der Compiler ist möglicherweise in der Lage, das Anhängen von Zeichenfolgen zu optimieren, aber es wird wahrscheinlich viel Müll erzeugt
und
2
Wenn Sie einen BufferedReader in einen String konvertieren möchten, verwenden Sie Apache Commons und erfinden Sie den Quaddel nicht neu: String myStr = org.apache.commons.io.IOUtils.toString (myBufferedReaderInstance);
Jaime Marín
8
UTF8 = "utf8", nette Variable;)
Nicofisi
7

Ich bin jedes Mal auf dasselbe Problem gestoßen, wenn ein Sonderzeichen es als markiert. Um dies zu lösen, habe ich versucht, die folgende Codierung zu verwenden: ISO-8859-1

BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("txtPath"),"ISO-8859-1"));

while ((line = br.readLine()) != null) {

}

Ich hoffe, das kann jedem helfen, der diesen Beitrag sieht.

Joshua Cleveland
quelle
1
Könnten Sie bitte sagen, welche Zeichen in UTF-8 nicht unterstützt werden?
USM