2009-11-19 4 views
17

Supponiamo di avere un InputStream contenente dati di testo e voglio convertirlo in un String (ad esempio, così posso scrivere il contenuto dello stream su un file di registro).Come si converte un InputStream in una stringa in Java?

Qual è il modo più semplice per prendere il InputStream e convertirlo in un String?

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

possibile duplicato del [In Java come si fa a leggere un flusso di input in una stringa?] (Http: // StackOverflow. it/questions/309424/in-java-how-do-a-read-an-input-stream-in-a-string) –

+0

Accetto. Ho votato per chiudere questo come duplicato e modificato l'altra domanda per includere alcune delle parole chiave del titolo e del testo della domanda da qui. –

risposta

17

Questa è la mia versione,

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

È possibile utilizzare un BufferedReader per leggere il flusso in un StringBuilder in un ciclo, e quindi ottenere l'intero contenuto dalla 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(); 
} 

Full disclosure: Si tratta di una soluzione che trovato su KodeJava.org. Sto postando qui per commenti e critiche.

+2

Ricorda che il costruttore di BufferedReader che stai utilizzando presuppone la codifica di testo predefinita della piattaforma sui byte provenienti da InputStream, che probabilmente sarà errata. È necessario conoscere la codifica e specificarla nel costruttore Reader. –

+4

Utilizzando questo costruttore, si indica a InputStreamReader di utilizzare la codifica della piattaforma predefinita, che dovrebbe essere evitata. Dovresti specificare il set di caratteri in cui i dati sono codificati, in modo che venga decodificato correttamente usando uno degli altri tre costruttori. – Sylar

+2

È anche inutile usare un BufferedReader per dividere l'input su interruzioni di riga, solo per aggiungere manualmente le interruzioni di riga a StringBuilder e quasi un WTF per utilizzare effettivamente un StringBuilder per impedire la creazione dell'oggetto String, ma poi chiamare append (line + " \ n ") invece di append (riga) .append (" \ n "). Anche la chiusura di InputStream non è particolarmente intelligente. – jarnbjo

23

Se si desidera eseguire in modo semplice e affidabile, suggerisco di utilizzare il metodo Apache Jakarta Commons della libreria IO IOUtils.toString(java.io.InputStream, java.lang.String).

+1

Questo è il modo breve e dolce. –

+2

L'unico lato negativo di questo è che è necessario prendere una dipendenza esterna in questa libreria, che potrebbe non essere sempre desiderata. –

+1

È * necessario * specificare la codifica, altrimenti utilizzerà la piattaforma predefinita, che è tutto tranne che affidabile. –

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

più here

+0

La risposta * BEST *. –