1. 概要

このクイックチュートリアルでは、InputStreamをファイルに書き込む方法を説明します。最初にプレーンJava、次にGuava、最後にApacheCommonsIOライブラリを使用します。

この記事は、ここBaeldungの「Java –BacktoBasic」チュートリアルの一部です。

2. プレーンJavaを使用して変換する

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

@Test
public void whenConvertingToFile_thenCorrect() throws IOException {
    Path path = Paths.get("src/test/resources/sample.txt");
    byte[] buffer = java.nio.file.Files.readAllBytes(path);

    File targetFile = new File("src/test/resources/targetFile.tmp");
    OutputStream outStream = new FileOutputStream(targetFile);
    outStream.write(buffer);

    IOUtils.closeQuietly(outStream);
}

この例では、入力ストリームには、ディスク上のファイルやメモリ内ストリームなど、既知の事前に決定されたデータが含まれていることに注意してください。 その結果、境界チェックを行う必要がなく、メモリが許せば、一度に読み取りと書き込みを行うことができます。

入力ストリームが進行中のデータストリームにリンクされている場合、は、進行中の接続からのHTTP応答のように、ストリーム全体を1回読み取ることはできません。 その場合、ストリームの終わりに到達するまで読み続けることを確認する必要があります

@Test
public void whenConvertingInProgressToFile_thenCorrect() 
  throws IOException {
 
    InputStream initialStream = new FileInputStream(
      new File("src/main/resources/sample.txt"));
    File targetFile = new File("src/main/resources/targetFile.tmp");
    OutputStream outStream = new FileOutputStream(targetFile);

    byte[] buffer = new byte[8 * 1024];
    int bytesRead;
    while ((bytesRead = initialStream.read(buffer)) != -1) {
        outStream.write(buffer, 0, bytesRead);
    }
    IOUtils.closeQuietly(initialStream);
    IOUtils.closeQuietly(outStream);
}

最後に、Java8を使用して同じ操作を実行できる別の簡単な方法を次に示します。

@Test
public void whenConvertingAnInProgressInputStreamToFile_thenCorrect2() 
  throws IOException {
 
    InputStream initialStream = new FileInputStream(
      new File("src/main/resources/sample.txt"));
    File targetFile = new File("src/main/resources/targetFile.tmp");

    java.nio.file.Files.copy(
      initialStream, 
      targetFile.toPath(), 
      StandardCopyOption.REPLACE_EXISTING);

    IOUtils.closeQuietly(initialStream);
}

3. Guavaを使用して変換する

次に、より単純なGuavaベースのソリューションを見てみましょう。

@Test
public void whenConvertingInputStreamToFile_thenCorrect3() 
  throws IOException {
 
    InputStream initialStream = new FileInputStream(
      new File("src/main/resources/sample.txt"));
    byte[] buffer = new byte[initialStream.available()];
    initialStream.read(buffer);

    File targetFile = new File("src/main/resources/targetFile.tmp");
    Files.write(buffer, targetFile);
}

4. CommonsIOを使用して変換する

最後に、ApacheCommonsIOを使用したさらに迅速なソリューションを次に示します。

@Test
public void whenConvertingInputStreamToFile_thenCorrect4() 
  throws IOException {
    InputStream initialStream = FileUtils.openInputStream
      (new File("src/main/resources/sample.txt"));

    File targetFile = new File("src/main/resources/targetFile.tmp");

    FileUtils.copyInputStreamToFile(initialStream, targetFile);
}

これで、InputStreamをファイルに書き込む3つの簡単な方法ができました。

これらすべての例の実装は、GitHubプロジェクトにあります。