У меня есть простая программа Java, которая создает серию временных файлов, хранящихся в локальном каталоге tmp. Я добавил простой хук выключения, который просматривает все файлы и удаляет их, а затем удаляет каталог tmp перед выходом из программы. вот код:
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
@Override
public void run() {
File tmpDir = new File("tmp/");
for (File f : tmpDir.listFiles()) {
f.delete();
}
tmpDir.delete();
}
}));
Моя проблема в том, что поток, который создает эти файлы, возможно, не завершился после запуска хука выключения, и, следовательно, может быть файл, созданный после вызова listFiles()
. это приводит к тому, что каталог tmp не удаляется. Я придумал 2 хака вокруг этого:
Взлом №1:
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
@Override
public void run() {
File tmpDir = new File("tmp/");
while (!tmp.delete()){
for (File f : tmpDir.listFiles()) {
f.delete();
}
}
}
}));
Взлом №2:
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
@Override
public void run() {
try{
Thread.sleep(1000);
} catch(InterruptedException e){
e.printStackTrace();
}
File tmpDir = new File("tmp/");
for (File f : tmpDir.listFiles()) {
f.delete();
}
tmpDir.delete();
}
}));
Ни то, ни другое не является особенно хорошим решением. Было бы идеально, если бы хук выключения ждал, пока все потоки не будут завершены, прежде чем продолжить. Кто-нибудь знает, можно ли это сделать?
File.deleteOnExit()
< /а>? Похоже, что обычное требование завершения будет применяться к этому в равной степени, как и к выполнению ловушки отключения. - person erickson   schedule 19.07.2012File.deleteOnExit();
работает с подфайлами, но не работает с каталогом tmp. предположительно причина в том, что нет гарантии, что все подфайлы будут удалены до того, как каталог попытается удалить. это приводит к непустому каталогу, который java не может удалить. - person ewok   schedule 19.07.2012