您好我发现了许多关于如何从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();
答案 0 :(得分:2)
因为批处理文件不是可执行文件。您需要执行cmd.exe
(或者,当您标记了问题DOS
,command.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运行