这是在Java 6中。
我不止一次见过人们创建临时文件,做某事,然后将其重命名为输出文件。所有内容都包含在try-finally块中,其中临时文件在finally
中被删除,以防万一之间出现问题。
try {
//do something with tempFile
//do something with tempFile
//do something with tempFile
tempFile.renameTo(outputFile);
}
finally {
if (tempFile.exists())
tempFile.delete()
}
我想知道这样做的好处是什么,而不是直接对输出文件做某些事情,如果出现异常则将其删除。
try {
//do something with outputFile
//do something with outputFile
//do something with outputFile
}
catch (Exception e) {
if (outputFile.exists())
outputFile.delete();
}
我的猜测是,当try块可以抛出多种异常时,删除finally
中的临时文件会让我受益。我猜对了吗?还有什么?
答案 0 :(得分:7)
finally
始终执行,而上述catch
未针对从java.lang.Error
派生的异常执行,并且当无法重命名时也会删除该文件(此操作不会当它失败时抛出异常...... Java IO中的一个古老的错误。)
答案 1 :(得分:3)
使用临时文件直到操作完成将确保您没有得到部分修改的输出文件。
此外,无论结果如何,finally块都将执行,而catch块仅在异常浮出时才会发生。
更深入的例子是......
try {
//do something with tempFile
//operation is complete since we made it this far; transition
//tempFile into outputFile
tempFile.renameTo(outputFile);
}
catch (Exception e) {
//perform error logic
}
finally {
if (tempFile.exists())
tempFile.delete()
}
答案 2 :(得分:2)
最后总是执行,所以不同之处在于,在第一种情况下,文件总是被删除(对于正常执行和抛出异常)。如果您只想在出现问题时删除该文件,请在catch块中删除。
答案 3 :(得分:0)
据我所知,删除/复制和其他文件操作是通过OS API完成的,并且不保证这些API目前正常工作。例如,如果您自己的程序和任何其他程序保持临时文件打开,则API将无法删除该文件。因此,在使用TEMP文件的情况下,如果发生这种情况,用户将不会有错误的文件,而是有一个临时文件,他/她不知道该文件的用途,但如果您直接使用主文件,如果删除文件失败,您的用户将有一个包含错误数据的文件,我认为