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

Sha*_* D. 21 java file-io temporary-files

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

我打算让自己的实用程序类扩展FileInputStream并自己完成,但我有点惊讶的是没有已经存在的东西.

编辑:用例是我有一个Struts 2动作,它返回InputStream一个页面的文件下载.据我所知,当动作完成或者FileInputStream不再使用时我没有得到通知,我不希望生成的(可能很大的)临时文件被遗留下来.

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

nos*_*nos 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;
         }
       }
   }
}
Run Code Online (Sandbox Code Playgroud)


小智 12

我知道这是一个相当老的问题。但是,这是Google的首批成果之一,而Java 7+内置了以下功能:

Path path = Paths.get(filePath);
InputStream fileStream = Files.newInputStream(path, StandardOpenOption.DELETE_ON_CLOSE);
Run Code Online (Sandbox Code Playgroud)

这种方法虽然有一些警告,但已在此处写下,但要点是,实现将尽最大努力尝试在关闭输入流时删除文件,如果失败,则尝试进行另一种尽力尝试。 JVM终止。它旨在与仅由JVM的单个实例使用的临时文件一起使用。如果应用程序对安全性敏感,那么还会有一些其他警告。


Pie*_*rre 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();}
}
Run Code Online (Sandbox Code Playgroud)