删除java中的临时文件

Posted

技术标签:

【中文标题】删除java中的临时文件【英文标题】:delete temporary file in java 【发布时间】:2010-11-04 19:37:31 【问题描述】:

我在 java 中创建临时文件,但我无法删除它。这是我写的代码:

temp = File.createTempFile("temp", ".txt");
temp.deleteOnExit();
fileoutput = new FileWriter(temp);
buffout = new BufferedWriter(fileoutput);

【问题讨论】:

在没有txtspk的情况下重写你的问题,我会考虑的。 【参考方案1】:

添加以下代码(在您对文件进行操作之后):

buffout.close();
fileoutput.close();
temp.delete();

只要文件上的某些流是打开的,它就会被锁定(至少在 JVM 的 Windows 实现上)。所以无法删除。

最好总是检查所有打开的流在使用后是否再次关闭,因为这是一种糟糕的内存泄漏情况。您的应用程序甚至会吃掉所有可用的文件句柄,从而导致系统无法使用。

【讨论】:

正要写同样的东西。通常,deleteOnExit() 相当不可靠。我会执行上述操作,但还要检查 temp.delete() 的返回值以确保删除所有锁。 正如 Mike 所说,我不会依赖 deleteOnExit()。此外,即使不再需要临时文件,也会保留到程序执行结束。在可能需要很长时间的服务器应用程序上。因此,最好明确删除文件。 能否从 Windows 资源管理器中删除文件(假设您使用的是 Windows)? 通过尝试并未能明确删除我创建的 tmp 文件,我发现我的代码中存在资源泄漏(我没有关闭的 PrintStream)。【参考方案2】:

有一个bug 说如果文件被文件写入器或其他任何东西打开,它不会被删除。在窗户上。检查您是否关闭了文件编写器。

另一种解决方法是安装 ShutdownHook,它会手动删除文件。

【讨论】:

deleteOnExit 添加关闭钩子【参考方案3】:

您必须干净地关闭 VM 以使 deleteOnExit 正常工作(我怀疑)。在UNIX 上,kill 将是完全关闭(即将处理ShutdownHooks),而kill -9 更像是强制退出

deleteOnExit 绝对适合我!

【讨论】:

deleteOnExit 保留文件直到程序结束。如果程序只执行一个操作并在之后停止,那可能没问题,但在服务器应用程序上,临时文件会以这种方式保存很长时间,积累并可能耗尽您的 inode 和磁盘空间。 在问题中,deleteOnExit 的使用并非不合适——我们不知道具体的使用模式是什么。我会说 deleteOnExit 通常是不可取的,原因有很多(一个是它不可逆)【参考方案4】:

关闭输入流和输出流的代码:

    FileInputStream in = new FileInputStream();

     ArrayList list_in = new ArrayList<FileInputStream>();

     list_in.add(in);

     FileOutputStream out = new FileOutputStream();

     ArrayList list_out = new ArrayList<OutputputStream>();

     list_in.add(out);

     public do_before_exit()
     

      for(int i=0;i<list_in.size();i++)
      
      FileInputStream in=(FileInputStream)list_in.get(i)
       FileInputStream out=(FileInputStream)list_out.get(i)

      in.close()
    out.close();
   


【讨论】:

以上是关于删除java中的临时文件的主要内容,如果未能解决你的问题,请参考以下文章

Java怎么清除缓存

编个java程序 清理IE临时文件

如何查找电脑中的临时文件夹

清理删除电脑中的垃圾临时文件的方法有哪些

临时文件夹中的文件会自动删除吗?

如何在R中的并行任务中删除临时文件