2

我正在.bat动态地制作Java.

创建文件并执行后,我想删除它。

为了确保delete()在运行.bat文件后执行,我在不同的线程中删除了文件。

这是完成这项任务的好方法吗?您将如何以更好的方式实施它?

final File file = new File("run.bat");
file.createNewFile();
PrintWriter writer = new PrintWriter(file, "UTF-8");
writer.println(COMMAND1);
writer.println(COMMAND2);

.... ANOTHER COMMANDS

writer.close();
Runtime.getRuntime().exec("cmd /c start a.bat");

new Thread(new Runnable() {
    public void run() {
        file.delete();
    }
}).run();
4

3 回答 3

6

我不会在不同的线程中删除文件,如果在您尝试删除文件时文件执行仍在运行怎么办?

我会考虑从文件中询问退出代码,或者使用 process.waitFor() 导致当前线程等待(如有必要),直到此 Process 对象表示的进程终止。

Process p = Runtime.getRuntime().exec("cmd /c start a.bat");
p.waitFor();
file.delete();
于 2013-02-28T13:45:18.143 回答
2

试试这个,这会导致代码在删除文件之前等到批处理文件执行完成。

Process batchFileExecutionProcess = Runtime.getRuntime().exec("cmd /c start a.bat");
batchFileExecutionProcess.waitFor();
file.delete();

理想情况下,您还将在此解决方案中构建错误处理,例如从 waitFor() 方法中寻找 0 返回。

于 2013-02-28T13:45:38.027 回答
1

不,这不是好方法。实际上,我没有看到额外线程的任何优势。它很可能会在文件仍在使用时尝试删除该文件,cmd并且删除将失败。相反,您应该使用Processobject (的结果exec())并等到它完成并删除文件然后:

Process p = Runtime.getRuntime().exec("cmd /c start a.bat");
p.waitFor();
file.delete()
于 2013-02-28T13:46:33.870 回答