閉じたときにFileInputStream
で基になるファイルを自動的に削除する既存の方法はありますか?
FileInputStream
を拡張して自分で行うために、独自のユーティリティクラスを作成することを計画していましたが、まだ何かが存在しないことに少し驚いています。
edit:ユースケースは、ページからファイルをダウンロードするためにInputStream
を返すStruts2アクションがある場合です。私の知る限り、アクションが終了したとき、またはFileInputStream
が使用されなくなったときに通知が届かないので、生成される(潜在的に大きな)一時ファイルを横になってダウンロードされます。
質問はStruts2に固有のものではなかったので、元々その情報を含めなかったため、質問が複雑になりました。
標準ライブラリにはそのようなものはなく、Apache-commonsライブラリにもそのようなものはないので、次のようになります。
public class DeleteOnCloseFileInputStream extends FileInputStream {
private File file;
public DeleteOnCloseFileInputStream(String fileName) throws FileNotFoundException{
this(new File(fileName));
}
public DeleteOnCloseFileInputStream(File file) throws FileNotFoundException{
super(file);
this.file = file;
}
public void close() throws IOException {
try {
super.close();
} finally {
if(file != null) {
file.delete();
file = null;
}
}
}
}
これはかなり古い質問だと思います。ただし、これはGoogleでの最初の結果の1つであり、Java 7+には次の機能が組み込まれています。
Path path = Paths.get(filePath);
InputStream fileStream = Files.newInputStream(path, StandardOpenOption.DELETE_ON_CLOSE);
ただし、このアプローチにはいくつかの注意点がありますが、それらは記述されています ここ 、しかし要点は、入力ストリームが閉じられたときに実装がファイルを削除しようと最善を尽くすことです。失敗すると、JVMが終了したときに別のベストエフォートが試行されます。これは、JVMの単一インスタンスによってのみ使用される一時ファイルでの使用を目的としています。アプリケーションがセキュリティに敏感な場合は、他にもいくつかの注意点があります。
ファイルを開く前に File.deleteOnExit() を使用できますか?
[〜#〜] edit [〜#〜]: 'close()'でファイルを削除するFileInputStreamをサブクラス化できます。
class MyFileInputStream extends FileInputStream
{
File file;
MyFileInputStream(File file) { super(file); this.file=file;}
public void close() { super.close(); file.delete();}
}
これが古い質問であることは知っていますが、この問題に遭遇し、javax.ws.rs.core.StreamingOutputという別の答えを見つけました。
これが私がそれをどのように使用したかです:
File downloadFile = ...figure out what file to download...
StreamingOutput so = new StreamingOutput(){
public void write(OutputStream os) throws IOException {
FileUtils.copyFile(downloadFile, os);
downloadFile.delete();
}
ResponseBuilder response = Response.ok(so, mimeType);
response.header("Content-Disposition", "attachment; filename=\""+downloadFile.getName()+"\"");
result = response.build();