[英]How to stop an input-waiting Windows batch process in Java?
我有一个Windows批处理文件simple.bat
,它在stdin中产生一些输出,并以pause
结尾。 我想运行此批处理文件,然后在我的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
然后再处理其输出。 如果批处理文件在慢速计算机上运行怎么办? 我正在寻求建议,是否有比异步停止该过程更好的方法。 非常感谢你!!
如果您的脚本不需要向其发送任何输入,并且您以cmd /c simple.bat
身份运行它,那么最简单的方法是关闭进程的标准输入:
p.getOutputStream().close();
我自己进行了一次快速测试,这消除了pause
并让脚本终止。 您当然会有多余的一行。 Press any key to continue . . .
Press any key to continue . . .
在您的输出中,但我想您可以解决。
销毁该过程可能是正确的,作为一个后备。 您将不得不考虑如何使您的应用程序失败:中止比挂起过程更糟吗? 用户实际上会注意到哪些故障?
在大多数情况下,上述两种情况都是不希望的。
如果您知道已经暂停(基于最后一个readline()
),则可以实际写入该进程。 这可以通过获取输出流Process.getOutputStream()
来完成。 我无法对此进行测试,但是正常情况下,暂停也会对写入此流的字符产生反应。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.