为什么从我的 Java 应用程序运行此批处理文件失败



嗨,我发现了许多关于如何从 java 应用程序运行 dos 批处理的线程,并最终让它工作。但是,我被困在以下几点上:使用该代码,进程永远不会退出,并且应用程序会卡住。

p = Runtime.getRuntime().exec("ant.bat release",null,new File(".");
p.waitFor();
BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line = reader.readLine();
while (line != null) {
  line = reader.readLine();
  System.out.println("execTest: " + line);
}

现在,如果我在 p.waitFor() 之前进行读取,它可以工作。有人可以向我解释一下吗?

工作代码:

p = Runtime.getRuntime().exec("ant.bat release",null,new File(".");
BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line = reader.readLine();
while (line != null) {
  line = reader.readLine();
  System.out.println("execTest: " + line);
}
p.waitFor();

因为批处理文件不是可执行文件。您需要执行cmd.exe(或者,当您已将问题标记为DOScommand.com)提供/C和批处理文件作为参数。

编辑:我不应该对此感到惊讶,这已经被问到和回答了,所以去那里了解细节。做出这个答案 CW。

因为 waitfor 方法会阻塞直到 cmd 真正完成并返回,如果当 cmd 运行时,并且 cmd 输出一些东西到 std 流或错误流(在 u 视图中,它是输入流),并且您没有从流缓冲区读取信息导致缓冲区已满,并且如果 cmd 仍然需要写入,它同时阻止,直到您从流缓冲区读取数据,为CMD写入提供空间。

所以在U代码中,如果cmd不输出任何东西,即使你不读取输入流也可以得到结果,如果cmd输出错误流,你永远不会得到结果,因为你不读取错误流。

我的最佳做法是在调用 WaitFor 方法之前分别通过额外的两个线程读取 std 流和错误流。

my cmd 表示任何命令都可以由运行时运行

相关内容

  • 没有找到相关文章

最新更新