2009-12-11 19 views
18

Si comienzo con java.io.InputStream, ¿cuál es la forma más fácil de leer todo el flujo en una cadena (suponiendo utf-8)?Leer texto de InputStream

Esto debería ser bastante fácil, pero en su mayoría soy una persona C# y google me está fallando en esto. Gracias.

+2

http://stackoverflow.com/questions/309424/in-java-how-do-a-read-an-input-stream-in-to-a-string – akuhn

+0

doh, no busqué "Entrada Stream "(con un espacio intermedio). – jthg

Respuesta

17

Dependiendo de lo que las licencias que se sienta cómodo, es una one liner con la biblioteca de Jakarta Commons-IO.

+2

+1 - a menos que sepa lo que está haciendo, reutilizar una biblioteca ampliamente utilizada ahorra tiempo y esfuerzo. –

+2

Terminé usando org.apache.commons.io.IOUtils.toString (InputStream input, String encoding) – jthg

+2

Siempre voto cuando la gente sugiere algo de Jakarta Commons. A pesar de lo aburrido que es, todavía tienes cierta lógica de negocios para entregar al final del día y no tiene sentido reinventar la rueda todos los días. –

0

La lectura/escritura de secuencias es notablemente dolorosa en Java.

public static String getStreamContents(InputStream stream) throws IOException { 

    StringBuilder content = new StringBuilder() 

    Reader reader = new BufferedReader(new InputStreamReader(stream, "UTF-8")) 
    String lineSeparator = System.getProperty("line.separator"); 

    try { 
     String line 
     while ((line = reader.readLine()) != null) { 
      content.append(line + lineSeparator) 
     } 
     return content.toString() 

    } finally { 
     reader.close() 
    } 

} 
+1

swap new InputStreamReader (stream) con el nuevo InputStreamReader (stream, "UTF-8") – Buhb

+1

Su código descarta saltos de línea. –

+0

Hecho, gracias por las sugerencias –

9

Do especifique la codificación de caracteres. No codifique, introduzca errores y ejecute lentamente con un BufferedReader.

Aquí hay un ejemplo. Puede parametrizarlo con un tamaño de búfer, codificación, etc.

static String readString(InputStream is) throws IOException { 
    char[] buf = new char[2048]; 
    Reader r = new InputStreamReader(is, "UTF-8"); 
    StringBuilder s = new StringBuilder(); 
    while (true) { 
    int n = r.read(buf); 
    if (n < 0) 
     break; 
    s.append(buf, 0, n); 
    } 
    return s.toString(); 
} 
+3

+1 - pero una expresión común es escribir el ciclo de la siguiente manera: 'int n; while ((n = r.read (buf))> = 0) {s.append (buf, 0, n); } ' –

+4

Desafortunadamente, es una expresión común. Pero prefiero evitar las pruebas con efectos secundarios. – erickson

1

El uso de Commons-IO es probablemente la mejor opción. Para su interés, otro enfoque es copiar todos los bytes y luego convertirlo en una cadena.

public static String readText(InputStream is, String charset) throws IOException { 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    byte[] bytes = new byte[4096]; 
    for(int len;(len = is.read(bytes))>0;) 
     baos.write(bytes, 0, len); 
    return new String(baos.toByteArray(), charset); 
} 
1

he encontrado una manera agradable en Java 8 con corrientes:

public static String readString(InputStream is) { 
    BufferedReader br = new BufferedReader(new InputStreamReader(is)); 
    String content = br.lines().reduce("", String::concat); 
    return content; 
} 

Como se ha dicho anteriormente se puede intercambiar nueva InputStreamReader (es) con el nuevo InputStreamReader (es decir, "UTF-8") , pero no tengo experiencia con este constructor.

+0

Su sugerencia pierde los terminadores de línea \ n en el resultado. – Gabriel

+0

@Gabriel buen punto. ¿Qué pasa con: 'br.lines(). Reduce (" \ n ", String :: concat)' –