2011-02-11 15 views
73

Estoy tratando de leer desde un archivo text/plain a través de Internet, línea por línea. El código que tengo en este momento es:Lectura de InputStream como 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); 
} 

El archivo, test.txt, contiene ¡Hélló!, que estoy usando con el fin de probar la codificación.

Cuando reviso el OutputStream (out), lo veo como > ¬°H√©ll√≥!. No creo que esto sea un problema con el OutputStream ya que puedo hacer out.println("é"); sin problemas.

¿Alguna idea para leer del InputStream como UTF-8? ¡Gracias!

+1

El protocolo HTTP especifica la codificación. ¿Por qué no usas una API de biblioteca que maneja eso para ti? Nunca deberías adivinar la codificación de esta manera. No quiero ser negativo: ¡lo estás haciendo bien! Solo me pregunto si no hay una manera más fácil. – tchrist

+1

No tendré acceso al servidor que está sirviendo el archivo 'text/plain', desafortunadamente, y no está usando una codificación UTF-8. No estaba al tanto de ninguna buena biblioteca de red; ¿alguna sugerencia? –

+1

Al mirar [docs] (http://download.oracle.com/javase/6/docs/api/java/net/URL.html), no creo que deba especificar la codificación en absoluto. ¡Me sorprende que te den una transmisión de bytes! Usted tiene acceso a [URLConnection] subyacente (http://download.oracle.com/javase/6/docs/api/java/net/URLConnection.html), desde donde puede verificar la codificación de contenido, luego abra un InputStreamReader con el argumento correcto. Una comprobación rápida de la fuente no muestra nada que parezca hacer eso por usted, lo que parece bastante condenado y propenso a errores, así que probablemente me haya perdido algo. – tchrist

Respuesta

146

Ha solucionado mi problema. Esta línea:

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

necesita ser:

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

o desde Java 7:

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

Estoy bastante seguro de que la forma del constructor no generará una excepción en la entrada no válida. Debe usar el con un argumento 'CharsetDecoder dec'. Este es el mismo error de diseño de Java que tienen los constructores de 'OutputStreamWriter': solo uno de los cuatro condescendientes realmente le dice cuando algo sale mal. De nuevo, también tiene que usar el sofisticado argumento 'CharsetDecoder dec' allí. Lo único seguro y sensato es considerar que todos los demás constructores están en desuso, porque no se puede confiar en que se comporten. – tchrist

+1

Buen consejo, gracias. –

+5

Desde Java 7 es posible escribir el proporcionar el Charset como una constante no como una cadena '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) { 

    } 

probar esto, .. :-)

+7

En lugar de file + = str, cree un StringBuilder y añádalo. El compilador podría optimizar la cadena que se agrega, pero es probable que cree una gran cantidad de basura. – seand

+1

Si desea convertir un BufferedReader en una cadena, use Apache Commons, no reinvente la raíz: String myStr = org.apache.commons. io.IOUtils.toString (myBufferedReaderInstance); –

+1

UTF8 = "utf8", buena variable;) – Nicofisi

0

Corrí en el mismo problema cada vez que encuentra un carácter especial lo marca como . Para solucionar esto, he intentado usar la codificación: ISO-8859-1

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

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

} 

espero que esto puede ayudar a cualquiera que vea esta entrada.