是否存在让FileInputStream
在关闭时自动删除基础文件的方法?
我打算制作我自己的实用工具类来扩展FileInputStream
并自己做,但我很惊讶没有已经存在的东西。
编辑:用例是我有一个Struts 2操作,它会从页面返回InputStream
文件下载。据我所知,当操作结束或FileInputStream
不再使用时,我不会得到通知,我不希望生成的(可能很大的)临时文件是下载左边躺着。
问题不是Struts 2的具体问题,因此我最初没有包含该信息并使问题复杂化。
答案 0 :(得分:28)
在标准库中没有这样的东西,也没有任何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;
}
}
}
}
答案 1 :(得分:6)
打开文件之前可以使用File.deleteOnExit()吗?
编辑:您可以继承FileInputStream,它将删除'close()'上的文件;
class MyFileInputStream extends FileInputStream
{
File file;
MyFileInputStream(File file) { super(file); this.file=file;}
public void close() { super.close(); file.delete();}
}
答案 2 :(得分:6)
我知道这是一个相当老的问题;但是,这是Google的首批成果之一,而Java 7+内置了以下功能:
Path path = Paths.get(filePath);
InputStream fileStream = Files.newInputStream(path, StandardOpenOption.DELETE_ON_CLOSE);
尽管使用此方法有一些注意事项,它们是用here编写的,但要点是,实现将尽最大努力尝试在关闭输入流时删除文件,如果这样做的话, JVM终止时,failure会进行另一种尽力而为的尝试。它旨在与仅由JVM的单个实例使用的临时文件一起使用。如果该应用程序对安全性敏感,那么还会有一些其他警告。
答案 3 :(得分:3)
我知道这是一个老问题,但我刚遇到这个问题,并找到了另一个答案: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();