Java InputStream to String

Java InputStream to String

1. Überblick

In diesem Tutorial sehen wir unshow to convert an InputStream to a String mitGuava, derApache Commons IO-Bibliothek und einfachem Java an.

Dieser Artikel ist Teil vonthe “Java – Back to Basic” series hier am Beispiel.

2. Konvertieren mit Guave

Beginnen wir mit einem Guava-Beispiel, bei dem die Funktionalität vonByteSourcegenutzt wird:

@Test
public void givenUsingGuava_whenConvertingAnInputStreamToAString_thenCorrect()
  throws IOException {
    String originalString = randomAlphabetic(8);
    InputStream inputStream = new ByteArrayInputStream(originalString.getBytes());

    ByteSource byteSource = new ByteSource() {
        @Override
        public InputStream openStream() throws IOException {
            return inputStream;
        }
    };

    String text = byteSource.asCharSource(Charsets.UTF_8).read();

    assertThat(text, equalTo(originalString));
}

Gehen wir die Schritte durch:

  • first - wir verpacken unsereInputStream aByteSource - und soweit mir bekannt ist, ist dies der einfachste Weg, dies zu tun

  • then - Wir betrachten unsereByteSource alsCharSource mit einem UTF8-Zeichensatz.

  • finally - Wir verwendenCharSource, um es als String zu lesen.

Asimpler way of doing the conversion with Guava, aber der Stream muss explizit geschlossen werden. Zum Glück können wir einfach die Try-with-Resources-Syntax verwenden, um dies zu erledigen:

@Test
public void givenUsingGuavaAndJava7_whenConvertingAnInputStreamToAString_thenCorrect()
  throws IOException {
    String originalString = randomAlphabetic(8);
    InputStream inputStream = new ByteArrayInputStream(originalString.getBytes());

    String text = null;
    try (final Reader reader = new InputStreamReader(inputStream)) {
        text = CharStreams.toString(reader);
    }

    assertThat(text, equalTo(originalString));
}

3. Konvertieren mit Apache Commons IO

Schauen wir uns nun an, wie dies mit der Commons IO-Bibliothek gemacht wird.

Eine wichtige Einschränkung hierbei ist, dass - im Gegensatz zu Guave - keines dieser Beispiele dieInputStream schließt - weshalb ich persönlich die Guava-Lösung bevorzuge.

@Test
public void givenUsingCommonsIo_whenConvertingAnInputStreamToAString_thenCorrect()
  throws IOException {
    String originalString = randomAlphabetic(8);
    InputStream inputStream = new ByteArrayInputStream(originalString.getBytes());

    String text = IOUtils.toString(inputStream, StandardCharsets.UTF_8.name());
    assertThat(text, equalTo(originalString));
}

Wir können auch einStringWriter verwenden, um die Konvertierung durchzuführen:

@Test
public void givenUsingCommonsIoWithCopy_whenConvertingAnInputStreamToAString_thenCorrect()
  throws IOException {
    String originalString = randomAlphabetic(8);
    InputStream inputStream = new ByteArrayInputStream(originalString.getBytes());

    StringWriter writer = new StringWriter();
    String encoding = StandardCharsets.UTF_8.name();
    IOUtils.copy(inputStream, writer, encoding);

    assertThat(writer.toString(), equalTo(originalString));
}

4. Konvertieren mit Java -InputStream

Betrachten wir nun einen Ansatz auf niedrigerer Ebene mit einfachem Java - einInputStream und ein einfachesStringBuilder:

@Test
public void givenUsingJava5_whenConvertingAnInputStreamToAString_thenCorrect()
  throws IOException {
    String originalString = randomAlphabetic(DEFAULT_SIZE);
    InputStream inputStream = new ByteArrayInputStream(originalString.getBytes());

    StringBuilder textBuilder = new StringBuilder();
    try (Reader reader = new BufferedReader(new InputStreamReader
      (inputStream, Charset.forName(StandardCharsets.UTF_8.name())))) {
        int c = 0;
        while ((c = reader.read()) != -1) {
            textBuilder.append((char) c);
        }
    }
    assertEquals(textBuilder.toString(), originalString);
}

5. Konvertieren mit Java und aScanner

Als nächstes - schauen wir uns ein einfaches Java-Beispiel an - verwenden Sie einen StandardtextScanner:

@Test
public void givenUsingJava7_whenConvertingAnInputStreamToAString_thenCorrect()
  throws IOException {
    String originalString = randomAlphabetic(8);
    InputStream inputStream = new ByteArrayInputStream(originalString.getBytes());

    String text = null;
    try (Scanner scanner = new Scanner(inputStream, StandardCharsets.UTF_8.name())) {
        text = scanner.useDelimiter("\\A").next();
    }

    assertThat(text, equalTo(originalString));
}

Beachten Sie, dassInputStream durch Schließen vonScanner geschlossen wird.

Der einzige Grund, warum dies ein Java 7-Beispiel ist und kein Java 5-Beispiel, ist die Verwendung der Anweisungtry-with-resources, die in einen Standardblocktry-finallywill compile just fine with Java 5 umgewandelt wird.

6. Konvertieren mitByteArrayOutputStream

Schauen wir uns zum Schluss ein weiteres einfaches Java-Beispiel an, diesmal mit der KlasseByteArrayOutputStream:

@Test
public final void givenUsingPlainJava_whenConvertingAnInputStreamToString_thenCorrect()
  throws IOException {
    String originalString = randomAlphabetic(8);
    InputStream inputStream = new ByteArrayInputStream(originalString.getBytes());

    ByteArrayOutputStream buffer = new ByteArrayOutputStream();
    int nRead;
    byte[] data = new byte[1024];
    while ((nRead = inputStream.read(data, 0, data.length)) != -1) {
        buffer.write(data, 0, nRead);
    }

    buffer.flush();
    byte[] byteArray = buffer.toByteArray();

    String text = new String(byteArray, StandardCharsets.UTF_8);
    assertThat(text, equalTo(originalString));
}

In diesem Beispiel wird zuerstInputStream durch Lesen und Schreiben von Byteblöcken inByteArrayOutputStream konvertiert, dann wirdOutputStream in ein Bytearray transformiert, mit demStringerstellt wird ) s.

7. Konvertieren mitjava.nio

Eine andere Lösung besteht darin, den Inhalt derInputStream in eine Datei zu kopieren und diese dann inString: zu konvertieren

@Test
public final void givenUsingTempFile_whenConvertingAnInputStreamToAString_thenCorrect()
  throws IOException {
    String originalString = randomAlphabetic(DEFAULT_SIZE);
    InputStream inputStream = new ByteArrayInputStream(originalString.getBytes());

    Path tempFile = Files.createTempDirectory("").resolve(UUID.randomUUID().toString() + ".tmp");
    Files.copy(inputStream, tempFile, StandardCopyOption.REPLACE_EXISTING);
    String result = new String(Files.readAllBytes(tempFile));

    assertThat(result, equalTo(originalString));
}

Hier verwenden wir die Klassejava.nio.file.Files, um eine temporäre Datei zu erstellen und den Inhalt derInputStream in die Datei zu kopieren. Dann wird dieselbe Klasse verwendet, um den Dateiinhalt mit der MethodereadAllBytes() inString zu konvertieren.

8. Fazit

Nachdem ich den besten Weg kompiliert habe, um die einfache Konvertierung - InputStream in String - korrekt und lesbar durchzuführen, und nachdem ich so viele völlig unterschiedliche Antworten und Lösungen gesehen habe, denke ich, dassa clear and concise best practice for this is called for.

Die Implementierung all dieser Beispiele und Codefragmentecan be found on GitHub - dies ist ein Maven-basiertes Projekt, daher sollte es einfach zu importieren und auszuführen sein, wie es ist.