2012-02-22 1 views
2

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

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

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

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

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

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

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

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

+6

Перед попыткой удалить файл убедитесь, что вы закрыли все открытые потоки файлов. – mre

+0

Это все еще так. Это ошибка, связанная с Windows JDK-4715154. Вероятно, поэтому в библиотеке времени Scala есть специальная запись 'scala.compat.Platform.collectGarbage()'). – Epicurist

ответ

3

Это означает, что вы не звонили close().

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

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

0

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

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

+1

File.createTempFile() не выполняет никакой очистки. Он просто создает файл с уникальным именем в каталоге temp. Приложение должно по-прежнему удалять файл, когда это делается с ним. –