入力変数の1つがjava.io.Fileタイプであることを期待するメソッドがありますが、取得するのはInputStreamのみです。また、メソッドのシグネチャを変更することはできません。
実際にファイルをファイルシステムに書き込まずに、InputStreamをファイルタイプに変換するにはどうすればよいですか?
入力変数の1つがjava.io.Fileタイプであることを期待するメソッドがありますが、取得するのはInputStreamのみです。また、メソッドのシグネチャを変更することはできません。
実際にファイルをファイルシステムに書き込まずに、InputStreamをファイルタイプに変換するにはどうすればよいですか?
File
InputStreamの代わりにオブジェクトが必要なのはなぜですか?
回答:
このようなものが機能するはずです。簡単にするために、Java 7機能(閉じることができるリソースでブロックを試す)とApachecommons-ioのIOUtilsを使用したことに注意してください。それらを使用できない場合は少し長くなりますが、同じ考えです。
import org.apache.commons.io.IOUtils;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
public class StreamUtil {
public static final String PREFIX = "stream2file";
public static final String SUFFIX = ".tmp";
public static File stream2file (InputStream in) throws IOException {
final File tempFile = File.createTempFile(PREFIX, SUFFIX);
tempFile.deleteOnExit();
try (FileOutputStream out = new FileOutputStream(tempFile)) {
IOUtils.copy(in, out);
}
return tempFile;
}
}
deleteOnExit
は追加のサニティチェックとして使用し、無条件にそれに依存することはありません。特定の状況(kill -9
JVMなど)では、削除を実行するシャットダウンフックが呼び出されないことを私は知っています。
implementation 'org.apache.directory.studio:org.apache.commons.io:2.4'
、gradleに追加してください。
できません。入力ストリームは単なるデータの一般的なストリームであり、実際にファイルから発信されているという保証はありません。誰かがWebサービスの読み取りからInputStreamを作成した場合、または文字列をInputStreamに変換した場合、これをファイルにリンクする方法はありません。したがって、実際に実行できるのは、ストリームから一時ファイルにデータを書き込み(たとえば、File.createTempFileメソッドを使用して)、このファイルをメソッドにフィードすることだけです。
File#createTempFile()
は本当にあなたの最善の策です。
File#deleteOnExit()
。これにより、JVMは、JVMの終了時にファイルを自動的に削除しようとします。もちろん、ファイルが不要になり、使用されなくなったことがわかったら、一時ファイルを手動ですぐに削除することをお勧めします。しかし、不完全な世界では、不完全な解決策が必要になることがあります。