2016-02-23 7 views
0

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

File tempFile = File.createTempFile("sign_", "tmp.pdf"); 
tempFile.deleteOnExit(); 

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

Редактировать: я уже прочитал this example, но я думаю, что мне нужна «теоретическая» мотивация, а не пример кода, чтобы найти причину.

+1

[ "Удаление будет выполняться только для нормального завершения виртуальной машины, как определено Спецификацией языка Java. "] (https://docs.oracle.com/javase/7/docs/api/java/io/File.html#deleteOnExit()) Is JVM выходит аномально? –

+3

Если это ваш реальный код, вам не нужно будет устанавливать tmp.deleteOnExit(); to tempFile.deleteOnExit()? – Alex

+0

@AlexClem я скопировал из другой части кода, вы правы! Я редактирую – Razlo3p

ответ

1

Метод «deleteOnExit()» работает только в том случае, если виртуальная машина заканчивается нормально. Если сбой VM или принудительное завершение, файл может остаться восстановленным.

Я не знаю, как это реализовано, но вы можете попытаться поместить tempFile.deleteOnExit() внутри finally.

File tempFile = null; 
try{    
    tempFile = File.createTempFile("sign_", "tmp.pdf"); 

}catch(IOException e){   
    e.printStackTrace();    
} finally { 
    if (tempFile != null) { 
     tempFile.deleteOnExit(); 
     tempFile = null; 
     //Added a call to suggest the Garbage Collector 
     //To collect the reference and remove 
     System.gc(); 
    } 
} 

Или, может быть, закройте все ссылки на файл, а затем вызовите «File.delete()» для немедленного удаления.

Если кто-то работает, вероятно, существует некоторая ссылка на файл. Таким образом, вы можете попытаться установить файл файл, который нужно удалить с помощью org.apache.commons.io.FileUtils.

Пример org.apache.commons.io.FileUtils:

File tempFile = null; 
try{    
    tempFile = File.createTempFile("sign_", "tmp.pdf"); 

}catch(IOException e){   
    e.printStackTrace();    
} finally { 
    if (tempFile != null) { 
     FileUtils.forceDelete(tempFile); 
     System.out.println("File deleted"); 
    } 
} 

Пример org.apache.commons.io.FileDeleteStrategy:

File tempFile = null; 
try{    
    tempFile = File.createTempFile("sign_", "tmp.pdf"); 

}catch(IOException e){   
    e.printStackTrace();    
} finally { 
    if (tempFile != null) { 
     FileDeleteStrategy.FORCE.delete(tempFile); 
     System.out.println("File deleted"); 
    } 
} 
+0

попробовал это, но ничего, файлы все еще там – Razlo3p

+0

Я обновил ответ, включая вызов сборщика мусора после установки tempFile = null попытаться собрать ссылку. А также включил 2 разных способа FORCE удалить – Brother

+0

с этим подходом. У меня есть еще исключение: Невозможно удалить файл: C: \ Users \ USERNAME \ AppData \ Local \ Temp \ tmp.pdf – Razlo3p