Als je een java.io.InputStream
object hebt, hoe moet je dat object dan verwerken en een String
produceren?
Stel ik heb een InputStream
die tekstgegevens bevat, en ik wil die omzetten naar een String
, zodat ik die bijvoorbeeld naar een logbestand kan schrijven.
Wat is de makkelijkste manier om de InputStream
om te zetten naar een String
?
public String convertStreamToString(InputStream is) {
// ???
}
Een leuke manier om dit te doen is met behulp van Apache commons IOUtils
om de InputStream
naar een StringWriter
te kopiëren... zoiets als
StringWriter writer = new StringWriter();
IOUtils.copy(inputStream, writer, encoding);
String theString = writer.toString();
of zelfs
// NB: does not close inputStream, you'll have to use try-with-resources for that
String theString = IOUtils.toString(inputStream, encoding);
Als alternatief zou je ByteArrayOutputStream
kunnen gebruiken als je je Streams en Writers niet wilt mengen
Apache Commons staat het toe:
String myString = IOUtils.toString(myInputStream, "UTF-8");
Natuurlijk kunt u ook andere tekencoderingen dan UTF-8 kiezen.
Zie ook: (documentatie)
Rekening houdend met het bestand moet men eerst een java.io.Reader
instantie krijgen. Deze kan dan worden gelezen en toegevoegd aan een StringBuilder
(we hebben StringBuffer
niet nodig als we het niet in meerdere threads benaderen, en StringBuilder
is sneller). De truc hier is dat we in blokken werken, en als zodanig geen andere bufferstromen nodig hebben. De blokgrootte wordt geparametriseerd voor runtime prestatie optimalisatie.
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();
}