2009-11-19 10 views
17

Supposons que j'ai un InputStream qui contient des données de texte et que je souhaite le convertir en String (par exemple, afin que je puisse écrire le contenu du flux dans un fichier journal).Comment convertir un InputStream en String en Java?

Quelle est la meilleure façon de prendre le InputStream et de le convertir en String?

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

double possible de [En Java comment faire lire un flux d'entrée pour une chaîne?] (Http: // stackoverflow. com/questions/309424/java-how-do-a-read-a-input-stream-in-a-string) –

+0

D'accord. J'ai voté pour fermer ceci comme doublon et édité l'autre question pour inclure certains des mots-clés de titre et le texte de question d'ici. –

Répondre

17

C'est ma version,

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

Vous pouvez utiliser un BufferedReader pour lire le flux dans un StringBuilder dans une boucle, puis obtenir le contenu complet 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(); 
} 

La divulgation complète: Ceci est une solution I trouvé sur KodeJava.org. Je l'affiche ici pour commenter et critiquer.

+2

Gardez à l'esprit que le constructeur BufferedReader que vous utilisez suppose le codage de texte par défaut de la plate-forme sur les octets provenant de InputStream, ce qui est probablement faux. Vous devez connaître l'encodage et le spécifier dans le constructeur du lecteur. –

+4

En utilisant ce constructeur, vous dites à InputStreamReader d'utiliser le codage de plate-forme par défaut, ce qui devrait être évité. Vous devez spécifier le jeu de caractères dans lequel les données sont codées afin qu'il soit correctement décodé en utilisant l'un des trois autres constructeurs. – Sylar

+2

Il est également inutile d'utiliser BufferedReader pour diviser l'entrée sur les sauts de ligne, juste pour ajouter les sauts de ligne manuellement à StringBuilder et presque un WTF pour utiliser un StringBuilder pour empêcher la création d'un objet String, puis appelez append (line + " \ n ") au lieu de append (ligne) .append (" \ n "). Fermer l'InputStream n'est pas particulièrement intelligent. – jarnbjo

23

Si vous voulez le faire simplement et de manière fiable, je suggère d'utiliser la méthode Apache Jakarta Commons IO library IOUtils.toString(java.io.InputStream, java.lang.String).

+1

C'est la façon courte et douce. –

+2

Le seul inconvénient est que vous devez prendre une dépendance externe dans cette bibliothèque, ce qui n'est pas toujours souhaitable. –

+1

Vous devez * spécifier * le codage, sinon il utilisera la valeur par défaut de la plate-forme, qui est tout sauf fiable. –

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

plus here

+0

La meilleure réponse. –

Questions connexes