删除java中的临时文件

删除java中的临时文件,java,file-io,core,Java,File Io,Core,我正在用java创建临时文件,但无法删除它。这是我写的代码: temp = File.createTempFile("temp", ".txt"); temp.deleteOnExit(); fileoutput = new FileWriter(temp); buffout = new BufferedWriter(fileoutput); 添加以下代码(对文件执行操作后): 只要文件上的某个流处于打开状态,它就会被锁定(至少在JVM的windows实现中是这样)。所以它不能被删除 最好的做

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

temp = File.createTempFile("temp", ".txt");
temp.deleteOnExit();
fileoutput = new FileWriter(temp);
buffout = new BufferedWriter(fileoutput);
添加以下代码(对文件执行操作后):

只要文件上的某个流处于打开状态,它就会被锁定(至少在JVM的windows实现中是这样)。所以它不能被删除

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

有一种说法,如果文件由filewriter或任何东西打开,它将不会被删除。在窗户上。检查是否关闭文件写入程序


另一个解决方法是安装一个手动删除文件的程序。

您必须干净地关闭一个VM,以便
deleteOnExit
正常工作(我怀疑)。在
UNIX
a
kill
将是一个干净的关机(即
ShutdownHooks
将被处理),而
kill-9
更像是一个强制退出


deleteOnExit
绝对适合我

关闭InputStream和outputstream的代码:

    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();
   }

}
FileInputStream in=newfileinputstream();
ArrayList_in=新建ArrayList();
添加(in)中的列表;
FileOutputStream out=新的FileOutputStream();
ArrayList_out=新建ArrayList();
输入、添加(输出)列表;
退出前的公共do_()
{

对于(int i=0;我在不使用txtspk的情况下编写您的问题,我会仔细考虑。我正要编写相同的内容。通常,deleteOnExit()是不可靠的。我会执行上述操作,但也会检查temp.delete()的返回值,以确保所有锁都已移除。正如Mike所说,我不会依赖deleteOnExit()。此外,临时文件会一直保留到程序执行结束,即使不再需要。在服务器应用程序上,这可能需要很长时间。因此,最好显式删除该文件。是否可以从Windows资源管理器中删除该文件(假设您使用的是Windows)?通过尝试并未能明确删除我创建的tmp文件,我在代码中发现了一个资源泄漏(我没有关闭的PrintStream).deleteOnExit添加一个shutdown hook deleteOnExit保留文件直到程序结束。如果程序只执行一个操作,然后停止,这可能是正常的,但在服务器应用程序上,临时文件会以这种方式保留很长一段时间,积累并可能消耗您的inode和磁盘空间。在这个问题中,deleteOnExit的使用是不是不合适——我们不知道具体的使用模式是什么。我想说,deleteOnExit通常不受欢迎,原因有很多(一个是它是不可逆的)
    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();
   }

}