InputStream in String umwandeln - Beispiel

Oft ist es notwendig, einen InputStream in einen String umzuwandeln, um etwa Daten aus einer Datei oder einem Netzwerk-Socket auszulesen.

Inhaltsverzeichnis

InputString in String byteweise auslesen

Ein InputStream ist ein Stream von Bytes. Die einfachste Methode ist, die Bytes auszulesen und in einen String umzuwandeln.

private static String toStringInputStream(InputStream is) throws IOException {
    byte[] buffer = new byte[1024];
    StringBuilder stringBuilder = new StringBuilder();
    int length = 0;

    while ((length = is.read(buffer)) >= 0) {
        stringBuilder.append(new String(Arrays.copyOfRange(buffer, 0, length), "UTF-8"));
    }

    return stringBuilder.toString();
}

Zuerst werden die Variablen deklariert und initialisiert. Das Byte-Array buffer dient als Zwischenspeicher für die eingelesenen Bytes aus dem InputStream. Der StringBuilder dient dazu, die einzelnen eingelesenen Strings zusammenzufügen. Die Variable length speichert die jeweils eingelesenen Bytes (also jeweils 1024, ausser es wurden weniger eingelesen, etwa am Ende eines Files).

Der Ausdruck (length = is.read(buffer)) >= 0 macht zwei Sachen auf einmal: er weist der Variablen length die Anzahl der eingelesenen Bytes zu und vergleicht danach ob die Länge größer oder gleich 0 ist. Die Methode read(byte[] buffer) gibt den Wert -1 zurück, wenn der Stream zu Ende ist.

Zum Schluß wird der konkatenierte Wert des StringBuilders zurückgegeben.

InputStream mit einem Reader auslesen

Diese Methode verwendet einen InputStreamReader um die Daten aus dem InputStream auszulesen.

private static String toStringInputStreamReader(InputStream is) throws IOException {
    InputStreamReader isr = new InputStreamReader(is, Charset.forName("UTF-8"));
    char[] buffer = new char[1024];
    StringBuilder stringBuilder = new StringBuilder();
    int length = 0;

    while ((length = isr.read(buffer, 0, buffer.length)) >= 0) {
        stringBuilder.append(buffer, 0, length);
    }
    isr.close();

    return stringBuilder.toString();
}

Der Vorteil hier ist, dass nicht bei jedem Schleifendurchlauf ein neuer String erzeugt werden muss, sondern die eingelesenen Chars an den StringBuilder angehängt werden.

InputStream nach String mit Guava

Google Guava nimmt uns wie so oft die Arbeit ab. Die Lösung ist ein Einzeiler:

private static String toStringGuava(InputStream is) throws IOException {
    return new String(ByteStreams.toByteArray(is), StandardCharsets.UTF_8);
}

Die statische Methode ByteStreams.toByteArray(is) gibt ein Byte-Array zurück, mit dem wir einfach einen neuen String erstellen und urückgeben können.


Ähnliche Artikel