Kako preberem / pretvorim InputStream v niz v Javi?

Č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) {
    // ???
}
Rešitev

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

Komentarji (15)

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)

Komentarji (9)

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();
}
Komentarji (12)