1概要

このチュートリアルでは、http://code.google.com/p/guava-libraries/[Guava](http://commons.apache.org)を使用して、

InputStream

をString ** に変換する方法を調べます。/proper/commons-io/[Apache Commons IO]ライブラリ、およびプレーンJava。

この記事はリンクの一部です:/java-tutorial[The Java – Back to Basic]シリーズ、ここBaeldung。


2 Guava

で変換する

グアバの例から始めましょう。

@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));
}

手順を見ていきましょう。


  • 最初

    – 私たちは

    InputStream



    ByteSource

    にラップします

知っている、これがそうする最も簡単な方法です


そして** – 私たちは

ByteSource

をUTF8の

CharSource

として見ています。

文字セット


  • ついに

    – 文字列として読み込むために

    CharSource

    を使います。

Guava

を使用して変換を行う

簡単な方法ですが、ストリームを明示的に閉じる必要があります。幸いなことに、try-with-resources構文を使ってそれを処理できます。

@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 Apache Commons IO

で変換する

それでは、Commons IOライブラリーを使ってこれを行う方法を見てみましょう。

ここで重要な注意点は – Guavaとは対照的に – これらの例はどちらも

InputStream

をクローズしないことです – これが私が個人的にはGuavaソリューションを好む理由です。

@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));
}

変換を行うために

StringWriter

を使用することもできます。

@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 Javaで変換する –

InputStream


それでは、プレーンJavaを使用した低レベルのアプローチ、つまり

InputStream

と単純な

StringBuilder

を見てみましょう。

@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 Javaと

Scanner


で変換する

次に、標準的なテキスト

Scanner

を使用して、単純なJavaの例を見てみましょう。

@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));
}


InputStream

は、

Scanner

のクローズによってクローズされます。

これがJava 7の例であり、Java 5の例ではない唯一の理由は、

try-with-resources

ステートメントを使用することです – それを標準の

try-finally

block

に変換すると、Java 5

でうまくコンパイルできます。


6.

ByteArrayOutputStream


を使用して変換する

最後に、今度は

ByteArrayOutputStream

クラスを使用した、別の単純なJavaの例を見てみましょう。

@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));
}

この例では、最初にバイトブロックを読み書きすることによって

InputStream



ByteArrayOutputStream

に変換され、次に

OutputStream

がバイト配列に変換されて、

String

が作成されます。


7.

java.nio


で変換する

別の解決策は

InputStream

の内容をファイルにコピーしてからこれを__Stringに変換することです。

@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));
}

ここでは、

java.nio.file.Files

クラスを使用して一時ファイルを作成し、

InputStream

の内容をファイルにコピーします。

次に、同じクラスを使用して、

readAllBytes()

メソッドを使用してファイルの内容を

String

に変換します。


8結論

InputStreamからStringへの簡単な変換を行うための最善の方法を正しく読みやすい方法でコンパイルした後、そして非常に多くの極端に異なる回答や解決策を見た後で、

これに対する明確で簡潔なベストプラクティスが

と呼ばれると思います。

これらすべての例とコードスニペットの実装はhttps://github.com/eugenp/tutorials/tree/master/core-java-io[GitHub]** にあります。これはMavenベースのプロジェクトなので、インポートしてそのまま実行するのは簡単なはずです。