4724 Stimmen

Wie lese/konvertiere ich einen InputStream in einen String in Java?

Wenn Sie eine java.io.InputStream Objekt, wie sollten Sie dieses Objekt verarbeiten und eine String ?


Angenommen, ich habe eine InputStream die Textdaten enthält, und ich möchte sie in eine String so dass ich das zum Beispiel in eine Protokolldatei schreiben kann.

Wie kann man am einfachsten die InputStream und konvertieren sie in eine String ?

public String convertStreamToString(InputStream is) {
    // ???
}

0 Stimmen

2 Stimmen

Denken Sie daran, dass Sie die Kodierung des Eingangsstroms berücksichtigen müssen. Die Systemvorgabe ist nicht unbedingt immer die, die Sie wollen.

23 Stimmen

Die meisten dieser Antworten wurden vor Java 9 geschrieben, aber jetzt kann man mit .readAllBytes ein Byte-Array aus dem InputStream holen. Also, einfach "new String(inputStream.readAllBytes())" funktioniert mit dem byte[] Konstruktor von String.

272voto

sampathpremarathna Punkte 3953

Verwendung:

InputStream in = /* Your InputStream */;
StringBuilder sb = new StringBuilder();
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String read;

while ((read=br.readLine()) != null) {
    //System.out.println(read);
    sb.append(read);
}

br.close();
return sb.toString();

2 Stimmen

readLine() entfernt das Zeilenvorschubzeichen, so dass die resultierende Zeichenkette keine Zeilenumbrüche enthält, es sei denn, Sie fügen ein Zeilentrennzeichen zwischen jeder Zeile ein, die Sie dem Builder hinzufügen.

187voto

Tagir Valeev Punkte 91975

Der Vollständigkeit halber ist hier Java 9 Lösung:

public static String toString(InputStream input) throws IOException {
    return new String(input.readAllBytes(), StandardCharsets.UTF_8);
}

Dabei wird die readAllBytes Methode, die in Java 9 hinzugefügt wurde.

3 Stimmen

Ich habe einen Vergleich durchgeführt aquí und stellte fest, dass dies auf meinem Rechner die schnellste Lösung war, die etwa 60 % der Zeit der nächstschnelleren Lösung im Benchmarking benötigte.

0 Stimmen

>Diese Methode blockiert, bis alle verbleibenden Bytes gelesen wurden und das Ende des Streams erkannt wird oder eine Ausnahme ausgelöst wird.

2 Stimmen

@MartinMeeser alle Lösungen auf dieser Seite tun dies, da es Teil der Aufgabe ist.

186voto

Sakuraba Punkte 2551

Wenn Sie Google-Collections/Guava verwenden, können Sie wie folgt vorgehen:

InputStream stream = ...
String content = CharStreams.toString(new InputStreamReader(stream, Charsets.UTF_8));
Closeables.closeQuietly(stream);

Beachten Sie, dass der zweite Parameter (d. h. Charsets.UTF_8) für die Option InputStreamReader ist nicht notwendig, aber es ist im Allgemeinen eine gute Idee, die Kodierung anzugeben, wenn Sie sie kennen (was Sie tun sollten!)

137voto

TacB0sS Punkte 9806

Dies ist die beste reine Java-Lösung, die perfekt für Android und jede andere JVM geeignet ist.

Diese Lösung funktioniert erstaunlich gut... sie ist einfach, schnell und funktioniert bei kleinen und großen Streams gleichermaßen!!! (siehe Benchmark oben.. Nr. 8 )

public String readFullyAsString(InputStream inputStream, String encoding)
        throws IOException {
    return readFully(inputStream).toString(encoding);
}

public byte[] readFullyAsBytes(InputStream inputStream)
        throws IOException {
    return readFully(inputStream).toByteArray();
}

private ByteArrayOutputStream readFully(InputStream inputStream)
        throws IOException {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    byte[] buffer = new byte[1024];
    int length = 0;
    while ((length = inputStream.read(buffer)) != -1) {
        baos.write(buffer, 0, length);
    }
    return baos;
}

80voto

Jon Moore Punkte 1300

Verwendung:

import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.IOException;

public static String readInputStreamAsString(InputStream in)
    throws IOException {

    BufferedInputStream bis = new BufferedInputStream(in);
    ByteArrayOutputStream buf = new ByteArrayOutputStream();
    int result = bis.read();
    while(result != -1) {
      byte b = (byte)result;
      buf.write(b);
      result = bis.read();
    }
    return buf.toString();
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X