我有以下代码片段调用了一个Perl脚本,该脚本将写入stderr和stdout。
我一直遵循建议的过程,例如在Perl脚本中自动刷新stdout和stderr,并使用streamgobbler线程。我注意到这在某种程度上有助于解决我的问题,但是在Perl脚本生成大量输出的时候,它仍然会填满管道并挂起。唯一能阻止这种情况的是将以下内容添加到我的Perl脚本中,但是很明显我希望输出结果,所以这不是一个选项。
更新& gt;
另一个有趣的现象是,当我在Linux中cat/proc/pid/fd/pipe时,它会导致读取管道。这似乎是在转储管道的内容,这意味着我的Perl进程可以再次对其进行写入,从而完成。因此,我的Java进程不能正确地读取进程输出流。
Perl:
close STDOUT
close STDERR
我的Java看起来像下面这样
parserProcess = run.exec(config.getCMDArray(),env);
StreamGobbler errorGobbler = new StreamGobbler(parserProcess.getErrorStream(), "ERROR");
// any output?
StreamGobbler outputGobbler = new StreamGobbler(parserProcess.getInputStream(), "OUTPUT");
// kick them off
errorGobbler.start();
outputGobbler.start();
其中streamgobler是->
class StreamGobbler extends Thread
{
InputStream is;
String type;
StreamGobbler(InputStream is, String type)
{
this.is = is;
this.type = type;
}
public void run()
{
try
{
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line=null;
while ( (line = br.readLine()) != null)
System.out.println(type + ">" + line);
} catch (IOException ioe)
{
ioe.printStackTrace();
}
}
}
String line="";
status = parserProcess.waitFor();
提前谢谢