如何在Java中停止等待input的Windows批处理?

我有一个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.batpause结束,并使p仍然挂在那里等待按键。 因此,最终reader.readLine()将被阻止,永远不会返回。

不幸的是, simple.batsimple.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()来完成。 我还没有能够测试这个,但通常暂停也应该写入这个流的字符。