Process.waitFor()、threads 和 InputStreams
在伪代码中,我正在做的是:
Process proc = runtime.exec(command);
processOutputStreamInThread(proc.getInputStream());
processOutputStreamInThread(proc.getErrorStream());
proc.waitFor()
但是,有时看不到任何输出,有时可以看到。粗略地说,该方法创建命令的输出并将其发送到记录器。processOutputStreamInThread
BufferedInputStream
根据我所看到的,我猜不需要将其所有输出转储到由 和 馈送的流中,从而允许流为空。command
getInputStream()
getErrorStream()
我的试验结果如下:
(1) 在 java.lang.Process 中,是否要求在执行程序返回之前已读取其输出?waitFor()
文档仅说明:
如有必要,使当前线程等待,直到此对象所表示的进程终止。如果子进程已终止,则此方法将立即返回。如果子进程尚未终止,则调用线程将被阻塞,直到子进程退出。
Process
(2) 在什么情况下,溪流由提供并需要关闭和/或自动关闭?getInputStream
getErrorStream
文档仅说明:
获取子进程的错误流。该流从此 Process 对象所表示的进程的错误输出流中获取管道传输的数据。
实现说明:最好对输入流进行缓冲。
一位用户报告说,他必须自己关闭流,但我至少部分时间会遇到异常,表明当我尝试这样做时,流已经关闭。
编辑:更改为 ,现在在上面显示。getOutputStream
getInputStream
分辨率:问题最终是,在某些情况下,用于处理输出流的线程直到我非常短暂的进程完成后才会运行,导致输入流没有给我任何数据。 没有执行任何等待执行程序的输出。相反,程序在收集任何输出之前运行并终止。waitFor
我使用线程是因为我不确定我将在标准误差和标准输出上获得多少输出,并且我希望能够同时处理两者,而不会阻塞其中一个或另一个,如果其中只有一个具有可用数据。但是,由于我的线程无法始终如一地读取已执行程序的输出,因此这不是解决方案。
我的最终编码看起来像这样:
ProcessBuilder pb = new ProcessBuilder(cmdargs);
pb.redirectErrorStream(true);
Process proc = pb.start();
processOutputStream(proc.getInputStream());
proc.waitFor()