是否有关闭的现有FileInputStream删除?

时间:2011-01-14 17:27:06

标签: java file-io temporary-files

是否存在让FileInputStream在关闭时自动删除基础文件的方法?

我打算制作我自己的实用工具类来扩展FileInputStream并自己做,但我很惊讶没有已经存在的东西。

编辑:用例是我有一个Struts 2操作,它会从页面返回InputStream文件下载。据我所知,当操作结束或FileInputStream不再使用时,我不会得到通知,我不希望生成的(可能很大的)临时文件是下载左边躺着。

问题不是Struts 2的具体问题,因此我最初没有包含该信息并使问题复杂化。

4 个答案:

答案 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();