Java で InputStream をファイル オブジェクトに変換する

Mehvish Ashiq 2023年10月12日
  1. プレーン Java を使用して InputStreamFile オブジェクトに変換する
  2. Files.copy() メソッドを使用して InputStream を Java の File オブジェクトに変換する
  3. InputStream.transferTo() メソッドを使用して InputStream を Java の File オブジェクトに変換する
  4. Apache Commons IO API を使用して InputStream を Java の File オブジェクトに変換する
Java で InputStream をファイル オブジェクトに変換する

ファイルを作成してコンテンツを追加する必要があることがよくあります。 たとえば、ネットワーク経由で受信したバイトまたは String 要素をファイルに保存する必要があります。

いずれの場合も、データは InputStream として存在し、ファイルに書き込む必要があります。 今日のチュートリアルでは、Java で InputStreamFile オブジェクトに変換する方法について説明します。

そのために、Java のバージョンに応じて、InputStreamFile オブジェクトに変換するさまざまな方法を使用して、さまざまなサンプル コードを記述します。 いくつかのアプローチを以下に示します。

プレーン Java を使用して InputStreamFile オブジェクトに変換する

コード例:

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class plainJava {
  public static void main(String[] args) {
    try {
      InputStream inputStream = new FileInputStream(new File("./files/test.txt"));

      byte[] buffer = new byte[inputStream.available()];
      inputStream.read(buffer);

      File destinationFile = new File("./files/test-plainJava-output.txt");

      OutputStream outputStream = new FileOutputStream(destinationFile);
      outputStream.write(buffer);

    } catch (FileNotFoundException exception) {
      exception.printStackTrace();
    } catch (IOException exception) {
      exception.printStackTrace();
    }
  }
}

ファイル パスを指定して、上記の Java プログラムで FileInputStream をインスタンス化します。 ファイルが存在しない場合、またはスペルが間違っている場合は、FileNotFoundException 例外が生成されます。

FileInputStream を使用して、指定されたファイルから入力バイトを取得しています。 次に、byte 型の buffer という名前の配列を作成します。ここで、inputStream.available() メソッドは、read() 呼び出しがプログラムの実行フローをブロックするまで読み取ることができるバイト数を通知します。

その後、File クラスをインスタンス化して test-plainJava-output.txt ファイルを作成し、その参照を destinationFile 変数に保存します。 次に、FileOutputStream のオブジェクトを作成し、前のステップで作成した宛先ファイルの参照を渡し、byte コードを記述します。

次に、test.txt および test-plainJava-output.txt ファイルを開き、両方の内容が同じであることを確認します。 情報の読み取りまたは書き込み中に問題が発生した場合、IOException が発生する可能性があることを忘れないでください。

Files.copy() メソッドを使用して InputStream を Java の File オブジェクトに変換する

コード例:

import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import java.nio.file.Files;
import java.nio.file.Paths;

public class filesCopy {
  private static final String OUTPUT_FILE = "./files/test_filesCopy-output.txt";

  public static void main(String[] args) {
    URI u = URI.create("https://www.google.com/");

    try (InputStream inputStream = u.toURL().openStream()) {
      // Java 1.7 onwards
      Files.copy(inputStream, Paths.get(OUTPUT_FILE));
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

このアプローチは、Java 7 以降で使用できます。 上記のコード フェンスでは、上で示したように InputStream オブジェクトを File オブジェクトにコピーするために使用される Java NIO API の Files.copy() を使用しています。

filesCopy プログラムでは、最初に出力ファイルのパスを含む文字列型のオブジェクトを作成します。

main() メソッドでは、create() メソッドを使用して URI オブジェクトを作成し、その参照を u 変数に保存します。これは次のステップで使用されます。 指定された文字列値が URI オブジェクトとして解析されることが確実な場合、create() を使用することを思い出してください。 それ以外の場合は、プログラマーの責任と見なされます。

次に、URI オブジェクト u を使用して toURL() メソッドを呼び出し、この URI から URL を構築し、openStream() メソッドを使用して java.io.InputSteam オブジェクトを取得します。 その後、Files.copy() メソッドを使用します。このメソッドは、inputStream オブジェクトと、データをコピーするファイルの Path という 2つのパラメーターを取ります。

ここで、解析されたデータが出力ファイル test_filesCopy-output.txt に表示されます。 try-catch ブロックを使用して、例外が発生した場合に処理します。 そうでない場合、プログラムは実行を終了します。

InputStream.transferTo() メソッドを使用して InputStream を Java の File オブジェクトに変換する

コード例:

import java.io.*;
import java.net.URI;

public class inputStreamTransferTo {
  public static void main(String[] args) {
    URI u = URI.create("https://www.google.com/");

    try (InputStream inputStream = u.toURL().openStream()) {
      File outputFile = new File("./files/test_transferTo-output.txt");
      OutputStream outputStream = new FileOutputStream(outputFile, false);
      inputStream.transferTo(outputStream); // Java 9

    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

Java 9 以降を使用している場合は、このアプローチを使用できます。 このコード例は、try ブロックのいくつかの違いを除いて、Files.copy() メソッドを使用した前のコード例と似ています。

ここでは、出力ファイル test_transferTo-output.txt を指定して File クラスのオブジェクトを作成します。 次に、この File オブジェクトを使用して FileOutputStream クラスをインスタンス化し、出力ファイル (test_transferTo_output.txt) にデータを書き込むために使用します。

最後に、inputStream.transferTo() メソッドを使用します。このメソッドは、出力ストリームをパラメーターとして取り、inputStream を指定された outputSteam に直接コピーします。 これで、解析されたデータが出力ファイル test_transferTo_output.txt に含まれます。

また、プログラムの終了を回避するために、このコードを try-catch ブロック内に含めました。

Apache Commons IO API を使用して InputStream を Java の File オブジェクトに変換する

コード例:

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import org.apache.commons.io.FileUtils;

public class apacheCommons {
  public static void main(String[] args) throws IOException {
    URI u = URI.create("https://www.google.com/");
    try (InputStream inputStream = u.toURL().openStream()) {
      File outputFile = new File("./files/test_apache_output.txt");
      // commons-io
      FileUtils.copyInputStreamToFile(inputStream, outputFile);
    }
  }
}

このコード例は、前のものと似ています。 toURL を呼び出す URI オブジェクトを作成します。このオブジェクトは、この URI オブジェクトを介して URL を構築し、openStream() メソッドを使用して java.io.InputStream オブジェクトを取得し、File をインスタンス化します。 ここではtest_apache_output.txtである出力ファイルのパスを指すクラス。

ただし、Apache Commons IO API を使用して、入力ストリームを Java のファイル オブジェクトに変換しています。 この API は非常に便利で、さまざまなファイル入出力操作を実行するためのさまざまな機能を提供します。

このライブラリを使用するには、まず、次のように commons-io 依存関係を pom.xml ファイルに追加する必要があります。

<dependency>
      <groupId>commons-io</groupId>
      <artifactId>commons-io</artifactId>
      <version>2.7</version>
</dependency>

次に、copyInputStreamToFile() メソッドを使用して、入力ストリームからバイトを読み取り、指定したファイルにコピーできます。 これで、解析されたデータが出力ファイルである test_apache_output.txt ファイルに表示されます。

著者: Mehvish Ashiq
Mehvish Ashiq avatar Mehvish Ashiq avatar

Mehvish Ashiq is a former Java Programmer and a Data Science enthusiast who leverages her expertise to help others to learn and grow by creating interesting, useful, and reader-friendly content in Computer Programming, Data Science, and Technology.

LinkedIn GitHub Facebook

関連記事 - Java InputStream