2010-08-13 17 views
8

duplicados posibles:
How do I convert an InputStream to a String in Java?
In Java how do a read an input stream in to a string?String de Java desde InputStream

que tienen un InputSteam y necesitan simplemente obtener una única y sencilla String con el contenido completo.

¿Cómo se hace esto en Java?

+2

puedes contar? Por definición, un Stream no tiene límites. A menos que haya algunas restricciones más, no puede obtener una cadena (algo de tamaño fijo) de una transmisión ilimitada. –

+2

Esto se ha preguntado muchas veces: http://stackoverflow.com/questions/1763789/how-do-i-convert-an-inputstream-to-a-string-in-java – bakkal

+0

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

Respuesta

8

Aquí hay una modificación de la respuesta de Gopi que no tiene el problema de terminación de línea y también es más efectiva ya que no necesita objetos String temporales para cada línea y evita la copia redundante en BufferedReader y el trabajo adicional en readLine().

public static String convertStreamToString(InputStream is, String ecoding) throws IOException 
{ 
    StringBuilder sb = new StringBuilder(Math.max(16, is.available())); 
    char[] tmp = new char[ 4096 ]; 

    try { 
     InputStreamReader reader = new InputStreamReader(is, ecoding); 
     for(int cnt; (cnt = reader.read(tmp)) > 0;) 
      sb.append(tmp, 0, cnt); 
    } finally { 
     is.close(); 
    } 
    return sb.toString(); 
} 
+1

+1 manejo de codificación más sana. –

0

Envuelva la secuencia en un lector para obtener la conversión de la configuración regional, y luego siga leyendo mientras recopila en un StringBuffer. Cuando haya terminado, haga un toString() en el StringBuffer.

5

Necesita construir un InputStreamReader para envolver el flujo de entrada, convirtiendo entre datos binarios y texto. Especifique la codificación adecuada según su fuente de entrada.

Una vez que tenga un InputStreamReader, se podría crear una BufferedReader y leer el contenido de la línea por línea, o simplemente leer al búfer de memoria intermedia y anexar a un StringBuilder hasta que los read() llamada devuelve -1.

La biblioteca Guava hace la segunda parte de este fácil de usar CharStreams.toString(inputStreamReader).

+0

Nunca lo he intentado, pero ¿no debería saber qué representa la secuencia antes? ¿tu hiciste esto? Si tuvieras una transmisión de tal manera que read() nunca devolviera -1, no habría ningún valor ni siquiera para intentar esto. Pero, al mismo tiempo, no puedo pensar en una corriente en mi cabeza que nunca termine. –

+1

@Thomas: Bueno, podrías crear fácilmente una transmisión que solo haya dado números aleatorios. Asumía que la pregunta se hacía en una situación en la que el concepto de "leer hasta el final de la secuencia" tenía sentido ... –

2

Aquí hay un código de ejemplo adaptado de here.

public String convertStreamToString(InputStream is) throws IOException { 
     /* 
     * To convert the InputStream to String we use the BufferedReader.readLine() 
     * method. We iterate until the BufferedReader return null which means 
     * there's no more data to read. Each line will appended to a StringBuilder 
     * and returned as String. 
     */ 
     if (is != null) { 
      StringBuilder sb = new StringBuilder(); 
      String line; 

      try { 
       BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8")); 
       while ((line = reader.readLine()) != null) { 
        sb.append(line).append("\n"); 
       } 
      } finally { 
       is.close(); 
      } 
      return sb.toString(); 
     } else {  
      return ""; 
     } 
    } 
+2

Tenga en cuenta que eso normalizará las terminaciones de línea; no devolverá necesariamente el texto original exacto datos. –

+0

cierto. código editado para incorporar su sugerencia. – Gopi

+0

Ahora no incluirá los finales de línea en absoluto. Creo que Jon Skeet solo decía que cada terminación de línea '\ r \ n' (o' \ r') se convierte en '\ n'. –

0

También puede usar un StringWriter de la siguiente manera; cada read de su InputStream coincide con un write (o append) al StringWriter, y al finalizar puede llamar al getBuffer para obtener un StringBuffer que podría usarse directamente o puede llamar al método toString.

3

También puede utilizar Apache Commons IO library

En concreto, puede utilizar IOUtils#toString(InputStream inputStream) method

+0

Como ingeniero de software, me encanta esto. Reutilizando bibliotecas existentes para hacer el trabajo. Apache Commons (y todos los proyectos de Apache en general) están muy bien hechos y son bastante útiles en varias situaciones. –

+0

Tenga en cuenta que el uso del método anterior utiliza la codificación predeterminada de la plataforma, es decir, el resultado depende de la configuración del usuario u otros factores externos. La mayoría de las veces es mejor usar un método esperando la codificación como parámetro adicional. Ver [este comentario en una pregunta relacionada] (http://stackoverflow.com/questions/309424/read-convert-an-inputstream-to-a-string#comment4886900_309448). Apaches 'IOUtils' proporciona tales métodos, también. Por cierto, el enlace a Javadoc está roto ... – siegi