繁体   English   中英

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

[英]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.batpause结尾,并且使p仍然挂在那里等待按键被按下。 结果,最终reader.readLine()将被阻止并且永远不会返回。

不幸的是, simple.batsimple.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM