关闭时是否存在现有的文件输入流删除?

2022-09-01 12:32:51

是否有一种现有方法可以在关闭时自动删除基础文件?FileInputStream

我打算制作自己的实用程序类来扩展并自己完成,但我有点惊讶于已经没有东西存在了。FileInputStream

编辑:用例是,我有一个 Struts 2 操作,该操作从页面返回一个 for 文件下载。据我所知,当操作完成或不再使用时,我不会收到通知,并且我不希望下载生成的(可能很大的)临时文件。InputStreamFileInputStream

这个问题不是特定于Struts 2的,所以我最初没有包含该信息,并使问题复杂化。


答案 1

在标准库中没有这样的东西,也没有任何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;
         }
       }
   }
}

答案 2

我知道这是一个相当古老的问题。但是,它是Google中的第一批结果之一,Java 7 +内置了此功能:

Path path = Paths.get(filePath);
InputStream fileStream = Files.newInputStream(path, StandardOpenOption.DELETE_ON_CLOSE);

不过,这种方法有几个警告,它们在这里写在这里,但要点是,当输入流关闭时,实现会尽最大努力删除文件,如果失败,则在JVM终止时再次尽力尝试。它旨在用于仅由单个 JVM 实例使用的临时文件。如果应用程序对安全敏感,则还有其他一些注意事项。