Če imate objekt java.io.InputStream
, kako naj ga obdelate in iz njega ustvarite niz String
?
Recimo, da imam objekt InputStream
, ki vsebuje besedilne podatke, in jih želim pretvoriti v Najaslovje
, da jih lahko na primer zapišem v dnevniško datoteko.
Kakšen je najlažji način, da vzamem InputStream
in ga pretvorim v String
?
public String convertStreamToString(InputStream is) {
// ???
}
Lep način za to je uporaba Apache commons IOUtils
za kopiranje InputStream
v StringWriter
... nekaj takega
StringWriter writer = new StringWriter();
IOUtils.copy(inputStream, writer, encoding);
String theString = writer.toString();
ali celo
// NB: does not close inputStream, you'll have to use try-with-resources for that
String theString = IOUtils.toString(inputStream, encoding);
Lahko pa uporabite tudi ByteArrayOutputStream
, če ne želite mešati tokov in pisalnikov
Apache Commons omogoča:
String myString = IOUtils.toString(myInputStream, "UTF-8");
Seveda lahko poleg UTF-8 izberete tudi druga kodiranja znakov.
Oglejte si tudi: (dokumentacija)
Ob upoštevanju datoteke je treba najprej pridobiti primerek java.io.Reader
. To lahko nato preberemo in dodamo v StringBuilder
(StringBuffer
ne potrebujemo, če do njega ne dostopamo v več niti, StringBuilder
pa je hitrejši). Trik je v tem, da delamo v blokih in zato ne potrebujemo drugih tokov za izravnavo. Velikost bloka je parametrizirana za optimizacijo zmogljivosti med izvajanjem.
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();
}