【问题标题】:Creating a ".bat" file, run it and delete it from Java创建一个“.bat”文件,运行它并从 Java 中删除它
【发布时间】:2013-02-28 13:40:14
【问题描述】:

我正在Java 中动态创建.bat

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

为了确保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();

【问题讨论】:

  • 如果要确保在执行后被删除,应等待执行完成后再删除。
  • 如果您可以访问 bat 文件,您可以将其设为 delete itself

标签: java multithreading runtime.exec


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    试试这个,它会导致代码等到批处理文件执行完成后再删除文件。

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-08-23
        • 2017-08-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-26
        • 2013-09-20
        相关资源
        最近更新 更多