2014-11-05 19 views
-1

当启动Java开发的工具时,它会在文件夹中创建临时文件。如果正确终止,这些文件将被删除,但如果以kill或pkill命令终止,则这些文件不会被删除。有什么办法可以发送信号给Java进程来在终止进程之前删除这些文件? 请帮我解决这个问题。 在前提前感谢使用Kill或pkill unix comamnds异常终止时的Java进程不会删除临时文件

+1

'kill -15'? *“终止信号,这是杀死进程的默认和最安全的方式。”*不知道它是否工作,虽然... – MadProgrammer 2014-11-05 10:17:52

+0

这个问题适合[超级用户](http://superuser.com/)更好。 – dic19 2014-11-05 12:09:12

回答

0

您可以添加关闭挂钩并清除您明确需要的所有内容。

Runtime.getRuntime().addShutdownHook(new Thread() { 
    public void run() { 
     //put your shutdown code here 
    } 
}); 

这实际上和java.io.File#deleteOnExit一样。

+0

如果'deleteOnExit'确实如此,它应该如何解决问题? – Holger 2014-11-05 14:03:06

0

看来File.deleteOnExit()在进程终止时很脆弱。相反,使用带有StandardOpenOption.DELETE_ON_CLOSE的NIO API似乎更可靠,即使它的规范只是说:“如果未调用close方法,则尝试在Java虚拟机终止时尝试删除该文件”

Eg运行以下程序时:

File f1=File.createTempFile("deleteOnExit", ".tmp"); 
f1.deleteOnExit(); 
final Path f2 = Files.createTempFile("deleteOnClose", ".tmp"); 
FileChannel ch = FileChannel.open(f2, StandardOpenOption.DELETE_ON_CLOSE); 
System.out.println(f1); 
System.out.println(f2); 
LockSupport.parkNanos(Long.MAX_VALUE); 
// the following statement is never reached, but it’s here to avoid 
// early cleanup of the channel by garbage collector 
ch.close(); 

,杀进程,同时它挂在parkNanos时,JVM离开deleteOnExit tmp文件,同时删除正确我的机器上的文件deleteOnClose