Ha van egy java.io.InputStream
objektum, hogyan kell feldolgozni ezt az objektumot, hogy egy Stringet
állítson elő?
Tegyük fel, hogy van egy InputStream
objektumom, amely szöveges adatokat tartalmaz, és ezt szeretném Stringgé
alakítani, hogy például egy naplófájlba írhassam.
Mi a legegyszerűbb módja annak, hogy az InputStream
adatfolyamot Stringgé
alakítsam?
public String convertStreamToString(InputStream is) {
// ???
}
Egy szép módja ennek az Apache commons IOUtils
használata a InputStream
másolásához egy StringWriter
-be... valami ilyesmi...
StringWriter writer = new StringWriter();
IOUtils.copy(inputStream, writer, encoding);
String theString = writer.toString();
vagy akár
// NB: does not close inputStream, you'll have to use try-with-resources for that
String theString = IOUtils.toString(inputStream, encoding);
Alternatívaként használhatod a ByteArrayOutputStream
opciót, ha nem akarod összekeverni a streameket és a Writert.
Az Apache Commons lehetővé teszi:
String myString = IOUtils.toString(myInputStream, "UTF-8");
Természetesen az UTF-8 mellett más karakterkódolást is választhatsz.
Lásd még: (dokumentáció)
Figyelembe véve a fájlt, először egy java.io.Reader
példányt kell létrehozni. Ezt aztán be lehet olvasni és hozzáadni egy StringBuilder
-hez (nincs szükségünk a StringBuffer
-re, ha nem több szálon keresztül érjük el, és a StringBuilder
gyorsabb). A trükk itt az, hogy blokkokban dolgozunk, és mint ilyen, nincs szükségünk más pufferfolyamokra. A blokkméret paraméterezhető a futásidejű teljesítményoptimalizálás érdekében.
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();
}