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