无法删除文件

时间:2010-03-10 22:58:50

标签: java

A有这样的问题:有一些RandomAccessFiles通过算法打开。它们使用的函数是递归的。所以我无法关闭它们(如果我这样做,我会崩溃算法)。有没有办法关闭它们(之后删除)?

5 个答案:

答案 0 :(得分:3)

从打开文件的非递归例程开始,将其传递给递归例程,然后在递归例程退出时关闭它。

答案 1 :(得分:2)

您可以使用File.deleteOnExit(),然后在JVM结束时自动删除文件。

答案 2 :(得分:2)

根据问题的详细信息,有很多方法可以解决这个问题:

  • 如果您只有1个文件,请在输入递归部分之前使用@Bill K在非递归例程中打开文件的解决方案是一种很好的方法。

  • 如果您要打开少量文件,请创建一个“文件管理器”类,其中一个方法将按需打开一个新文件,另一个方法将关闭并删除所有打开的文件。使用文件管理器更改算法以打开文件,并在try / finally的finally子句中调用“全部关闭”方法,围绕递归算法。

  • 如果您要打开任意数量的文件,则必须重新设计算法,以便能够以合理的方式按需关闭它们。或者更改算法,使其不需要使用这么多文件。

@Michael Borgwardt'解决方案(根本不关闭文件,并将其标记为退出时删除)可能很脆弱,特别是如果算法需要打开大量这些文件。许多操作系统平台对打开文件句柄的数量都有每个进程限制。

答案 3 :(得分:1)

每个递归函数都必须具有某种中止条件。只需在递归的“结尾”删除文件。

顺便说一下。你应该关闭你打开的每个文件,如果你的功能结构不允许你这样做,你应该改变它。

答案 4 :(得分:1)

看到算法很难说,但即使你使用递归实现,你应该能够在递归返回时关闭它。

其他方法是在递归函数之外打开和关闭文件:

例如:

 main() {
    File file = openFile()
    recursiveFunction( file ); // do whatever is needed and pass the file as arg
    file.close()
  }

或者在递归函数中打开和关闭文件

 void recursiveFunction() {
    File file = openFile()
    doX
    doY
    if( finished() ) { // guard condition executed when returning from the recursion
        closeFile()
    } else {
        recursiveFunction()
    } 
 }