Java で InputStream をファイル オブジェクトに変換する
-
プレーン Java を使用して
InputStream
をFile
オブジェクトに変換する -
Files.copy()
メソッドを使用してInputStream
を Java のFile
オブジェクトに変換する -
InputStream.transferTo()
メソッドを使用してInputStream
を Java のFile
オブジェクトに変換する -
Apache Commons IO API を使用して
InputStream
を Java のFile
オブジェクトに変換する
ファイルを作成してコンテンツを追加する必要があることがよくあります。 たとえば、ネットワーク経由で受信したバイトまたは String 要素をファイルに保存する必要があります。
いずれの場合も、データは InputStream
として存在し、ファイルに書き込む必要があります。 今日のチュートリアルでは、Java で InputStream
を File
オブジェクトに変換する方法について説明します。
そのために、Java のバージョンに応じて、InputStream
を File
オブジェクトに変換するさまざまな方法を使用して、さまざまなサンプル コードを記述します。 いくつかのアプローチを以下に示します。
プレーン Java を使用して InputStream
を File
オブジェクトに変換する
コード例:
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
ファイルに表示されます。