InputStreamからFileオブジェクトを作成することは可能ですか


121

java.io.Fileからオブジェクトを作成する方法はありますjava.io.InputStreamか?

私の要件は、RARからファイルを読み取ることです。一時ファイルを書き込もうとはしていません。RARアーカイブ内に読み込もうとしているファイルがあります。


1
私の要件は、RARからファイルを読み取ることです。RARから一時ファイルを書き込もうとしていないと仮定します。RAR内にはファイルがあります。読み取るだけです。
androidgalaxyman 2012

質問が理解できません。どうか明らかにしてください。InputStreamから元のファイルが必要な場合はありませんでした。ファイルではなく、RARファイルを読み取っています。他に何か必要な場合は、どうしますか?
ローン侯爵2012

回答:


87

新しいファイルを作成し、内容InputStreamをそのファイルにコピーする必要があります。

File file = //...
try(OutputStream outputStream = new FileOutputStream(file)){
    IOUtils.copy(inputStream, outputStream);
} catch (FileNotFoundException e) {
    // handle exception here
} catch (IOException e) {
    // handle exception here
}

IOUtils.copy()ストリームの手動コピーを回避するのに便利です。また、バッファリングも組み込まれています。


3
アンドロイドStudioでIOUtilsを解決し、あなたが参照するリンクが404であることができませんでした
Shahraiz T.

3
org.apache.directory.studio:org.apache.commons.ioを依存関係として追加する必要がありました。私の悪い。:)
Shahraiz T. 2016

7
OutputStreamを正しく閉じて、リソースまたはIOUtils.closeQuietlyを使用してください。私はその一例を知っていますが、初心者はそれを文字通りコピーします。
Rafael Membrives 2017


29

最初に一時ファイルを作成します。

File tempFile = File.createTempFile(prefix, suffix);
tempFile.deleteOnExit();
FileOutputStream out = new FileOutputStream(tempFile);
IOUtils.copy(in, out);
return tempFile;

IOUtilsのパッケージ名を含める
Ridhuvarshan

org.apache.commons.io
Shehan Simen

これはorg.apache.axis2.utilにも存在し、コピー機能の3番目のパラメーターがあります。機能もそこで機能します。何を使用するかについての比較はありますか?
Ridhuvarshan

26

Java 7以降、外部ライブラリを使用しなくても、1行で実行できます。

Files.copy(inputStream, outputPath, StandardCopyOption.REPLACE_EXISTING);

APIドキュメントをご覧ください。


2
これをAndroidで使用する場合、最小SDK 26が必要です。
ネフ

3

あなたが他のライブラリを使用したくない場合は、ここに変換する簡単な関数であるInputStreamにはOutputStream

public static void copyStream(InputStream in, OutputStream out) throws IOException {
    byte[] buffer = new byte[1024];
    int read;
    while ((read = in.read(buffer)) != -1) {
        out.write(buffer, 0, read);
    }
}

これで、Inputstreamファイルを使用して簡単にファイルに書き込むことができますFileOutputStream-

FileOutputStream out = new FileOutputStream(outFile);
copyStream (inputStream, out);
out.close();

1

リソースブロックを使用した簡単なJava 11ソリューション

public static void copyInputStreamToFile(InputStream input, File destination) {  

    try (OutputStream output = new FileOutputStream(destination)) {
        input.transferTo(output);
    } catch (IOException ioException) {
        ioException.printStackTrace();
    }

}

java.io.InputStream#transferToはJava 9以降で使用できます。


0

Javaバージョン7以降を使用している場合は、try-with-resourcesを使用してを適切に閉じることができますFileOutputStream。次のコードはcommons-ioIOUtils.copy()から使用しています。

public void copyToFile(InputStream inputStream, File file) throws IOException {
    try(OutputStream outputStream = new FileOutputStream(file)) {
        IOUtils.copy(inputStream, outputStream);
    }
}  

OutputStreamを閉じる必要はありませんか?Tomasz N.からの回答のように
trinity420

3
@ trinity420 try初期化部分で指定されたリソースtryは、ブロックが終了すると自動的に閉じられます。
h3xStream 2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.