我有以下片段調用一個寫入STDERR和STDOUT的perl腳本。 我一直在遵循建議的過程,例如自動刷新perl腳本中的STDOUT和STDERR並使用streamgobbler線程。我注意到這可以幫助我的問題達到某種程度,但有時候perl腳本會產生大量輸出,但仍然會填滿它的管道並掛起。唯一似乎停止這添加到我的Perl腳本以下顯然我想輸出,所以這不是一個選項。java似乎並沒有讀取我的perl管道輸出,並正在填滿
更新>>
另一個有趣的發生難度時,我貓在/ proc/PID/FD /管#在linux下它會導致讀取管道進行訪問。這似乎轉儲管道的內容意味着我的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();
因此StreamGobbler是 - >
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();
在此先感謝
如果你所有的Perl腳本都關閉了STDOUT和STDERR,難怪你明白了;)你能發佈你的Perl腳本嗎? – mfontani 2010-07-29 11:50:58