嗨,我发现了许多关于如何从 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
(或者,当您已将问题标记为DOS
,command.com
)提供/C
和批处理文件作为参数。
编辑:我不应该对此感到惊讶,这已经被问到和回答了,所以去那里了解细节。做出这个答案 CW。
因为 waitfor 方法会阻塞直到 cmd 真正完成并返回,如果当 cmd 运行时,并且 cmd 输出一些东西到 std 流或错误流(在 u 视图中,它是输入流),并且您没有从流缓冲区读取信息导致缓冲区已满,并且如果 cmd 仍然需要写入,它同时阻止,直到您从流缓冲区读取数据,为CMD写入提供空间。
所以在U代码中,如果cmd不输出任何东西,即使你不读取输入流也可以得到结果,如果cmd输出错误流,你永远不会得到结果,因为你不读取错误流。
我的最佳做法是在调用 WaitFor 方法之前分别通过额外的两个线程读取 std 流和错误流。
my cmd 表示任何命令都可以由运行时运行