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.

22voto

Thamme Gowda Punkte 10173

Stellen Sie sicher, dass Sie die Streams am Ende schließen, wenn Sie Stream Readers verwenden.

private String readStream(InputStream iStream) throws IOException {
    //build a Stream Reader, it can read char by char
    InputStreamReader iStreamReader = new InputStreamReader(iStream);
    //build a buffered Reader, so that i can read whole line at once
    BufferedReader bReader = new BufferedReader(iStreamReader);
    String line = null;
    StringBuilder builder = new StringBuilder();
    while((line = bReader.readLine()) != null) {  //Read till end
        builder.append(line);
        builder.append("\n"); // append new line to preserve lines
    }
    bReader.close();         //close all opened stuff
    iStreamReader.close();
    //iStream.close(); //EDIT: Let the creator of the stream close it!
                       // some readers may auto close the inner stream
    return builder.toString();
}

EDIT: Unter JDK 7+ können Sie das try-with-resources-Konstrukt verwenden.

/**
 * Reads the stream into a string
 * @param iStream the input stream
 * @return the string read from the stream
 * @throws IOException when an IO error occurs
 */
private String readStream(InputStream iStream) throws IOException {

    //Buffered reader allows us to read line by line
    try (BufferedReader bReader =
                 new BufferedReader(new InputStreamReader(iStream))){
        StringBuilder builder = new StringBuilder();
        String line;
        while((line = bReader.readLine()) != null) {  //Read till end
            builder.append(line);
            builder.append("\n"); // append new line to preserve lines
        }
        return builder.toString();
    }
}

21voto

czerny Punkte 12815
String inputStreamToString(InputStream inputStream, Charset charset) throws IOException {
    try (
            final StringWriter writer = new StringWriter();
            final InputStreamReader reader = new InputStreamReader(inputStream, charset)
        ) {
        reader.transferTo(writer);
        return writer.toString();
    }
}
  • reine Java-Standardbibliothekslösung - keine Libs
  • seit Java 10 - Reader#transferTo(java.io.Writer)
  • schlupflose Lösung
  • keine Behandlung von Zeichen für neue Zeilen

18voto

Alex Punkte 7851

Kotlin-Benutzer tun es einfach:

println(InputStreamReader(is).readText())

während

readText()

ist die eingebaute Erweiterungsmethode der Kotlin-Standardbibliothek.

17voto

James Punkte 10942

Noch eine, für alle Spring-Benutzer:

import java.nio.charset.StandardCharsets;
import org.springframework.util.FileCopyUtils;

public String convertStreamToString(InputStream is) throws IOException { 
    return new String(FileCopyUtils.copyToByteArray(is), StandardCharsets.UTF_8);
}

Die Utility-Methoden in org.springframework.util.StreamUtils sind ähnlich wie die in FileCopyUtils aber sie lassen den Strom offen, wenn sie fertig sind.

17voto

laksys Punkte 3108

Hier ist die vollständige Methode für die Umwandlung InputStream in String ohne Verwendung einer Bibliothek eines Drittanbieters. verwenden StringBuilder für eine Single-Thread-Umgebung, ansonsten verwenden Sie StringBuffer .

public static String getString( InputStream is) throws IOException {
    int ch;
    StringBuilder sb = new StringBuilder();
    while((ch = is.read()) != -1)
        sb.append((char)ch);
    return sb.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