在catch期间删除最终vs删除输出文件期间的临时文件

时间:2011-01-04 15:51:27

标签: java file-io

这是在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中的临时文件会让我受益。我猜对了吗?还有什么?

4 个答案:

答案 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文件的情况下,如果发生这种情况,用户将不会有错误的文件,而是有一个临时文件,他/她不知道该文件的用途,但如果您直接使用主文件,如果删除文件失败,您的用户将有一个包含错误数据的文件,我认为