我有一个Windowsbatch filesimple.bat
,它在stdin中产生一些输出,并以pause
结束。 我想运行这个batch file,然后在我的Java代码中处理输出。
// create a Java process with simple.bat Process p = Runtime.getRuntime().exec("cmd /c simple.bat"); // get the output from the process p BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream())); StringBuilder builder = new StringBuilder(); String line = null; while ((line = reader.readLine()) != null) { builder.append(line); builder.append(System.getProperty("line.separator")); } String result = builder.toString();
上面的代码的问题是, simple.bat
以pause
结束,并使p
仍然挂在那里等待按键。 因此,最终reader.readLine()
将被阻止,永远不会返回。
不幸的是, simple.bat
是simple.bat
传给我的。 我无法删除pause
线。
我可以补充
Thread.sleep(1000); p.destroy();
在exec("cmd /c start simple.bat")
行之后,在处理其输出之前终止进程p
。 如果batch file在慢机器上运行,该怎么办? 我正在寻求意见是否有更好的方法,然后asynchronous停止进程。 非常感谢你!!
如果你的脚本不需要发送任何输入,而且你正在运行它作为cmd /c simple.bat
,那么最简单的事情就是关闭进程的标准输入:
p.getOutputStream().close();
我自己跑了一个快速测试,这就解散了pause
,让脚本终止。 你当然会有额外的行Press any key to continue . . .
Press any key to continue . . .
在你的输出,但我想你可以处理。
摧毁这个过程可以作为一个后备正确的。 你将不得不考虑如何更喜欢你的应用程序失败:是否中止比挂起的过程更糟? 用户实际上会注意到哪些故障?
在大多数情况下,上述两个都是不可取的。
如果您知道您已经达到了暂停(基于最后一条readline()
),您实际上可以写入该进程。 这可以通过获取输出流Process.getOutputStream()
来完成。 我还没有能够测试这个,但通常暂停也应该写入这个流的字符。