processbuilder使用java获取进程的输出结果
我想执行一个进程一段时间,然后得到输出并销毁该进程。这是我的密码
BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream()));
BufferedReader temp;
p.waitFor(7, TimeUnit.SECONDS);
temp=stdInput;
p.destroy();
System.out.println(temp.readLine());
但我得到的结果是
java.io.IOException: Stream closed
如何在执行流程7秒后复制结果?如果我使用这个代码
p.waitFor(7, TimeUnit.SECONDS);
while ((inputRead=stdInput.readLine()) != null){
Helper.log(inputRead);
}
while循环永远不会终止,因为进程在waitFor
之后仍然处于活动状态,所以我必须销毁它。如果我破坏了进程,我就无法再获得stdInput
的内容
# 1 楼答案
java.io.IOException: Stream closed
这可能是因为您在p.destroy()
之后调用temp.readLine()
问题似乎是,该过程没有在要检索的零件后添加新行终止符。要解决这个问题,可以将程序的输出分成小块,而不是逐行读取
下面是一个例子:
如果您知道程序输出的确切格式,更好的解决方案是使用扫描仪
上面的例子将一次读取一个单词的程序输出
从您的评论来看,问题似乎在于进程永远不会自行终止,并且您的程序永远不会退出
while
循环要解决这个问题,可以使用计时器在一段时间后销毁进程,下面是一个示例:
请记住,这种方法总是会导致
stdInput.readLine()
抛出异常# 2 楼答案
您不希望调用
waitFor()
,因为它会等待进程被销毁。只要InpuutStream处于打开状态,您也不希望读取,因为这样的读取只有在进程终止时才会终止相反,你可以简单地启动这个过程,然后等待7秒钟。7秒后,在不等待流关闭的情况下读取缓冲区中的可用数据:
如果进程一直在打印,那么
stdInput.ready()
总是返回true,您可以尝试以下方法:在这个解决方案中,线程不再休眠,而是在接下来的7秒钟内读取
InputStream
,然后关闭进程