2009-11-19 16 views
17

Supongamos que tengo un InputStream que contiene datos de texto, y quiero convertir esto a String (por ejemplo, para que pueda escribir el contenido de la secuencia en un archivo de registro).¿Cómo convierto un InputStream a una cadena en Java?

¿Cuál es la forma más fácil de tomar el InputStream y convertirlo en un String?

public String convertStreamToString(InputStream is) { 
    // ??? 
} 
+4

posible duplicado del [En Java cómo hacer una lectura a una secuencia de entrada en una cadena?] (Http: // stackoverflow. com/questions/309424/in-java-how-do-a-read-an-input-stream-in-to-a-string) –

+0

De acuerdo. He votado para cerrar esto como duplicado y he editado la otra pregunta para incluir algunas de las palabras clave del título y el texto de la pregunta desde aquí. –

Respuesta

17

Esta es mi versión,

public static String readString(InputStream inputStream) throws IOException { 

    ByteArrayOutputStream into = new ByteArrayOutputStream(); 
    byte[] buf = new byte[4096]; 
    for (int n; 0 < (n = inputStream.read(buf));) { 
     into.write(buf, 0, n); 
    } 
    into.close(); 
    return new String(into.toByteArray(), "UTF-8"); // Or whatever encoding 
} 
0

Puede utilizar un BufferedReader para leer la corriente en un StringBuilder en un bucle, y luego obtener el contenido completo de la StringBuilder:

public String convertStreamToString(InputStream is) { 
    BufferedReader reader = new BufferedReader(new InputStreamReader(is)); 
    StringBuilder sb = new StringBuilder(); 

    String line = null; 

    try { 
    while ((line = reader.readLine()) != null) { 
    sb.append(line + "\n"); 
    } 
    } catch (IOException e) { 
    e.printStackTrace(); 
    } finally { 
    try { 
     is.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    } 

    return sb.toString(); 
} 

revelación completa: Se trata de una solución que encontrado en KodeJava.org. Lo estoy publicando aquí para comentarios y críticas.

+2

Tenga en cuenta que el constructor de BufferedReader que está utilizando asume la codificación de texto predeterminada de la plataforma en los bytes procedentes de InputStream, lo que probablemente sea incorrecto. Debe conocer la codificación y especificarla en el constructor Reader. –

+4

Al usar este constructor, le dices al InputStreamReader que use la codificación de la plataforma por defecto, lo cual debe evitarse. Debe especificar el conjunto de caracteres en el que están codificados los datos para que se decodifique correctamente utilizando uno de los otros tres constructores. – Sylar

+2

También es un esfuerzo innecesario usar un BufferedReader para dividir la entrada en saltos de línea, solo para agregar los saltos de línea manualmente a StringBuilder y casi una WTF para usar un StringBuilder para prevenir la creación de objetos String, pero luego invocar append (line + " \ n ") en lugar de anexar (línea) .append (" \ n "). Cerrar el InputStream tampoco es particularmente inteligente. – jarnbjo

23

Si desea hacerlo de manera sencilla y confiable, sugiero usar el Apache Jakarta Commons IO library IOUtils.toString(java.io.InputStream, java.lang.String) método.

+1

Esta es la manera corta y dulce. –

+2

El único inconveniente de esto es que debe tomar una dependencia externa en esta biblioteca, que puede no ser siempre deseada. –

+1

* Necesita * especificar también la codificación, de lo contrario utilizará la plataforma predeterminada, que no es confiable. –

4
String text = new Scanner(inputStream).useDelimiter("\\A").next(); 

más here

+0

La * MEJOR * respuesta. –

Cuestiones relacionadas