创建一个“.bat”文件,运行它并从Java中删除它

时间:2013-02-28 13:40:15

标签: java multithreading runtime.exec

我正在.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();

3 个答案:

答案 0 :(得分:5)

我不会在另一个线程中删除该文件,如果在您尝试删除它时文件执行仍在运行,该怎么办?

我会考虑从文件中询问exit code,或者使用process.waitFor(),这会导致当前线程在必要时等待,直到此Process对象表示的进程终止。

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

答案 1 :(得分:2)

尝试这样做会导致代码等到批处理文件执行完成后再删除文件。

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

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

答案 2 :(得分:1)

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

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