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

时间:2013-09-26 17:33:23

标签: java batch-file ant

您好我发现了许多关于如何从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();

2 个答案:

答案 0 :(得分:2)

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

编辑:我不应该对this has been asked and answered感到惊讶,所以请到那里了解详细信息。回答CW。

答案 1 :(得分:0)

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

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

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

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