0

嗨,我发现了很多关于如何从 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();
4

2 回答 2

2

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

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

于 2013-09-26T17:36:16.530 回答
0

因为waitfor方法将阻塞直到cmd真正完成并返回,如果当cmd运行时,cmd输出一些东西到std流或errorstream(在你看来,它是inputstream),你不从流缓冲区中读取信息导致缓冲区已满,如果 cmd 仍然需要写入,它会阻塞,直到您从流缓冲区读取数据以为 cmd 写入提供空间。

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

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

我的 cmd 表示运行时可以运行任何命令

于 2013-09-26T18:18:53.037 回答