Удаление файла Java и System.gc()

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

Thread.sleep(1000);
file.delete();

и это тоже не удалило файл. Затем я создал цикл while

while(!file.delete())
   Thread.sleep(1000);

и это зацикливалось навсегда. Затем я добавил

System.gc();
file.delete();

и это сработало!!!

Я убедился, что корректно закрыл или сбросил файл. Я хочу знать, почему мой код работал с System.gc()?


person Vig    schedule 22.02.2012    source источник
comment
Перед попыткой удалить файл убедитесь, что вы закрыли все открытые файловые потоки.   -  person mre    schedule 22.02.2012
comment
Это все еще правда. Это ошибка JDK-4715154, связанная с Windows. Вероятно, поэтому в библиотеке времени выполнения Scala есть специальная запись scala.compat.Platform.collectGarbage().   -  person Epicurist    schedule 18.08.2014


Ответы (2)


Кажется, это указывает на то, что вы не звонили close().

Причина: во времена зарождения Java метод Object.finalize() использовался для очистки при сборке мусора, а для ввода-вывода выполнялся метод close().

Пока файл не используется (не закрыт), его нельзя удалить в Windows.

person Joop Eggen    schedule 22.02.2012

Вам нужно использовать File.createTempFile() и вызовите deleteOnExit() для полученного файла. Он будет управлять очисткой временного файла в конце выполнения для вас. Вы не должны делать это вручную, пусть система сделает это за вас, поэтому они включили это в стандартную библиотеку.

Также вы всегда должны вызывать .close(), чтобы убедиться, что все данные сброшены в файл и дескриптор может быть правильно очищен.

person Community    schedule 22.02.2012
comment
File.createTempFile() не выполняет никакой очистки. Он просто создает файл с уникальным именем во временном каталоге. Приложение все равно должно удалить файл, когда оно будет сделано с ним. - person Michael Krussel; 22.02.2012