Удалить временный файл во время, наконец, против удаления выходного файла во время ловли - PullRequest
3 голосов
/ 04 января 2011

Это в 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();
}

Я предполагаю, что удаление временных файлов в finally дает мне преимущество, когда блок try может выдавать много видов исключений.Правильно ли мое предположение?Что еще?

Ответы [ 4 ]

7 голосов
/ 04 января 2011

finally всегда выполняется, в то время как вышеприведенное catch не выполняется для исключений, которые происходят из java.lang.Error, плюс он также удалит файл, когда его нельзя переименовать (эта операция не выдает исключение, когда это терпит неудачу ... древняя ошибка в Java IO).

3 голосов
/ 04 января 2011

Работа с временным файлом до завершения операции гарантирует, что вы не получите выходной файл, который частично изменен.

Кроме того, блок 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 голосов
/ 04 января 2011

finally всегда выполняется, поэтому разница в том, что в первом случае этот файл всегда удаляется (как для обычного выполнения, так и для исключения). Если вы хотите удалить этот файл, только если что-то пошло не так, перейдите к удалению в блоке catch.

0 голосов
/ 04 января 2011

Насколько я знаю, удаление / копирование и другие файловые операции выполняются через API-интерфейс ОС, и нет никаких гарантий, что эти API-интерфейсы работают в данный момент. например, если ваша собственная программа и любая другая программа поддерживают временный файл открытым, API не сможет удалить файл. Так что в случае работы с файлом TEMP, если это произойдет, у пользователя не будет плохого файла, вместо этого у него будет временный файл, и он / она не будет знать, для чего этот файл, но если вы работаете непосредственно с основным файлом, в случае сбоя при удалении файла у вашего пользователя будет файл, содержащий неверные данные Я думаю

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...