У меня есть следующий фрагмент, вызывающий Perl-скрипт, который пишет в STDERR и STDOUT.
Я следовал рекомендуемым процедурам, таким как автоматическая очистка STDOUT и STDERR в скрипте perl и использование потоков streamgobbler. Я заметил это, чтобы помочь моей проблеме в некоторой степени, но иногда, когда скрипт perl генерирует большие объемы вывода, он все равно будет заполнять свои каналы и зависать. Единственное, что, кажется, мешает этому добавить следующее в мой скрипт на perl, однако, очевидно, я бы хотел получить вывод, так что это не вариант.
обновление >>
Еще один интересный случай: когда я перехожу на / proc / pid / fd / pipe # в 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();
Заранее спасибо