このクイックチュートリアルでは、リーダーからInputStream への変換について説明します。最初はプレーンJava、次にGuava、最後にApacheCommonsIOライブラリを使用します。

この記事は、ここBaeldungの「Java –BacktoBasic」シリーズの一部です。

1. Javaを使用

Javaソリューションから始めましょう:

@Test
public void givenUsingPlainJava_whenConvertingReaderIntoInputStream_thenCorrect() 
  throws IOException {
    Reader initialReader = new StringReader("With Java");

    char[] charBuffer = new char[8 * 1024];
    StringBuilder builder = new StringBuilder();
    int numCharsRead;
    while ((numCharsRead = initialReader.read(charBuffer, 0, charBuffer.length)) != -1) {
        builder.append(charBuffer, 0, numCharsRead);
    }
    InputStream targetStream = new ByteArrayInputStream(
      builder.toString().getBytes(StandardCharsets.UTF_8));

    initialReader.close();
    targetStream.close();
}

一度にデータのチャンクを読み取っている(そして書き込んでいる)ことに注意してください。

2. グアバと

次へ–はるかに単純なGuavaソリューションを見てみましょう。

@Test
public void givenUsingGuava_whenConvertingReaderIntoInputStream_thenCorrect() 
  throws IOException {
    Reader initialReader = new StringReader("With Guava");

    InputStream targetStream = 
      new ByteArrayInputStream(CharStreams.toString(initialReader)
      .getBytes(Charsets.UTF_8));

    initialReader.close();
    targetStream.close();
}

変換全体を1つのライナーに変換する、すぐに使用できる入力ストリームを使用していることに注意してください。

3. CommonsIOを使用

最後に、いくつかのCommonsIOソリューションを見てみましょう。これも単純なワンライナーです。

まず、 ReaderInputStream:を使用します

@Test
public void givenUsingCommonsIOReaderInputStream_whenConvertingReaderIntoInputStream() 
  throws IOException {
    Reader initialReader = new StringReader("With Commons IO");

    InputStream targetStream = new ReaderInputStream(initialReader, Charsets.UTF_8);

    initialReader.close();
    targetStream.close();
}

最後に、 IOUtilsを使用した同じ変換:

@Test
public void givenUsingCommonsIOUtils_whenConvertingReaderIntoInputStream() 
  throws IOException {
    Reader initialReader = new StringReader("With Commons IO");

    InputStream targetStream = 
      IOUtils.toInputStream(IOUtils.toString(initialReader), Charsets.UTF_8);

    initialReader.close();
    targetStream.close();
}

ここではあらゆる種類のリーダーを扱っていることに注意してください。ただし、特にテキストデータを扱っている場合は、JVMのデフォルトを使用するのではなく、文字セットを明示的に指定することをお勧めします。

4. 結論

これで、ReaderInputStreamに変換する3つの簡単な方法がわかりました。 GitHubでサンプルを確認してください。