Как отмечает Тим Бендер, File.deleteOnExit()
не гарантирует, что файл действительно будет удален.
В системах Unixish (таких как Linux или OSX), однако, можно удалить временный файл перед записью в него (но после его открытия). Пока вы сохраняете открытый дескриптор файла, вы можете продолжать чтение и запись в него без проблем, даже если файл больше не существует в дереве каталогов, и ОС автоматически освободит пространство, используемое файлом, когда Программа завершает работу (или закрывает последний дескриптор файла).
Это не будет работать в Windows, которая имеет другую семантику файловой системы и не позволяет удалять открытые файлы. Однако в переносимом коде вы можете просто попытаться удалить файл после его открытия и, если это не удастся, вернуться к deleteOnExit()
:
File tempFile = File.createTempFile("tempfile", ".tmp");
RandomAccessFile fh = new RandomAccessFile (tempFile, "rw");
// try to delete the file now, fall back to deletion on exit
if ( !tempFile.delete() ) tempFile.deleteOnExit();
Обратите внимание, что, очевидно, File.deleteOnExit()
не очень надежен в Windows. Таким образом, когда это возможно, вы все равно должны пытаться вручную закрывать и удалять временные файлы, когда вы закончите с ними. Подробнее см. этот ответ, который я написал на другой вопрос .