Come posso leggere / convertire un InputStream in una stringa in Java?

Se hai un oggetto java.io.InputStream, come dovresti elaborare quell'oggetto e produrre una stringa?


Supponiamo che io abbia un InputStream che contiene dati di testo, e voglio convertirlo in una Stringa, così per esempio posso scriverlo in un file di log.

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

public String convertStreamToString(InputStream is) {
    // ???
}
Soluzione

Un bel modo per farlo è usare Apache commons IOUtils per copiare il InputStream in un StringWriter... qualcosa come

StringWriter writer = new StringWriter();
IOUtils.copy(inputStream, writer, encoding);
String theString = writer.toString();

o anche

// NB: does not close inputStream, you'll have to use try-with-resources for that
String theString = IOUtils.toString(inputStream, encoding); 

In alternativa, si potrebbe usare ByteArrayOutputStream se non si vuole mischiare i propri Streams e Writers

Commentari (15)

Apache Commons permette:

String myString = IOUtils.toString(myInputStream, "UTF-8");

Naturalmente, si possono scegliere altre codifiche di caratteri oltre a UTF-8.

Vedere anche: (documentazione)

Commentari (9)

Tenendo conto del file si dovrebbe prima ottenere un'istanza di java.io.Reader. Questo può poi essere letto e aggiunto a uno StringBuilder (non abbiamo bisogno di StringBuffer se non stiamo accedendo in più thread, e StringBuilder è più veloce). Il trucco qui è che lavoriamo in blocchi, e come tali non abbiamo bisogno di altri flussi di buffering. La dimensione del blocco è parametrizzata per l'ottimizzazione delle prestazioni in tempo reale.

public static String slurp(final InputStream is, final int bufferSize) {
    final char[] buffer = new char[bufferSize];
    final StringBuilder out = new StringBuilder();
    try (Reader in = new InputStreamReader(is, "UTF-8")) {
        for (;;) {
            int rsz = in.read(buffer, 0, buffer.length);
            if (rsz < 0)
                break;
            out.append(buffer, 0, rsz);
        }
    }
    catch (UnsupportedEncodingException ex) {
        /* ... */
    }
    catch (IOException ex) {
        /* ... */
    }
    return out.toString();
}
Commentari (12)