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) {
// ???
}
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
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)
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();
}