2011-02-11 12 views
73

Sto provando a leggere da un file text/plain su Internet, riga per riga. Il codice che ho in questo momento è:Reading InputStream come UTF-8

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); 
} 

Il file, test.txt, contiene ¡Hélló!, che sto usando per testare la codifica.

Quando ripasso lo OutputStream (out), lo vedo come > ¬°H√©ll√≥!. Non credo che questo sia un problema con lo OutputStream dato che posso fare out.println("é"); senza problemi.

Qualche idea per la lettura da InputStream come UTF-8? Grazie!

+1

Il protocollo HTTP specifica la codifica. Perché non stai utilizzando un'API di libreria che la gestisce per te? Non dovresti mai dover indovinare la codifica come questa. Non intendo essere negativo: stai andando alla grande! Mi chiedo solo se non c'è un modo più semplice. – tchrist

+1

Non avrò accesso al server che sta servendo il file 'text/plain', sfortunatamente, e non sta usando una codifica UTF-8. Non ero a conoscenza di alcuna buona libreria di rete; eventuali suggerimenti? –

+1

Guardando i [documenti] (http://download.oracle.com/javase/6/docs/api/java/net/URL.html), non penserei che tu debba specificare la codifica. Sono sorpreso che ti danno un flusso di byte! Hai accesso a [URLConnection] (http://download.oracle.com/javase/6/docs/api/java/net/URLConnection.html) sottostante, da cui puoi controllare Content-Encoding, quindi aprire un InputStreamReader con l'argomento corretto. Un rapido controllo della sorgente non mostra nulla che sembra fare quello per te, il che sembra piuttosto dannoso e soggetto a errori, quindi probabilmente mi sono perso qualcosa. – tchrist

risposta

146

Risolto il mio problema. Questa linea:

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

deve essere:

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

o dal Java 7:

BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream(), StandardCharsets.UTF_8)); 
+3

Sono abbastanza sicuro che la forma del costruttore non genererà un'eccezione sull'input non valido. Devi usare l'argomento con un 'CharsetDecoder dec'. Questo è lo stesso bug di progettazione Java che hanno i costruttori 'OutputStreamWriter': solo uno dei quattro in realtà è disposto a dirti quando qualcosa va storto. Anche in questo caso devi usare anche l'argomento 'CharsetDecoder dec'. L'unica cosa sicura e sana da fare è considerare tutti gli altri costruttori deprecati, perché non ci si può fidare che si comportino. – tchrist

+1

Buon consiglio, grazie. –

+5

Poiché Java 7 è possibile scrivere fornire il set di caratteri come costante e non come stringa 'StandardCharsets.UTF_8' – tobijdc

13
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) { 

    } 

Prova questa, .. :-)

+7

Invece del file + = str, creare un oggetto StringBuilder e aggiungerlo. Il compilatore potrebbe essere in grado di ottimizzare l'aggiunta di stringhe, ma probabilmente creerà molta immondizia – seand

+1

Se si desidera convertire un BufferedReader in una stringa, utilizzare Apache Commons, non reinventare il wheal: String myStr = org.apache.commons. io.IOUtils.toString (myBufferedReaderInstance); –

+1

UTF8 = "utf8", bella variabile;) – Nicofisi

0

mi sono imbattuto nello stesso problema ogni volta che trova un carattere speciale lo contrassegna come . per risolvere questo, ho provato ad utilizzare la codifica: ISO-8859-1

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

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

} 

Spero che questo può aiutare chi vede questo post.