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