Java, кажется, не читает мой вывод perl piped intime и заполняется - PullRequest
1 голос
/ 29 июля 2010

У меня есть следующий фрагмент, вызывающий 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();

Заранее спасибо

1 Ответ

2 голосов
/ 29 июля 2010

Я думаю, что вы описываете нормальное поведение для ваших Perl и Java-приложений. Фактический размер буфера за каналом не определен / зависит от ОС, но может составлять всего 1 КБ или 16 КБ. Это хорошо и разумно для процесса производства вывода блокировать, пока его текст не будет использован; что будет альтернативой? Выделяете ли вы еще больший объем памяти для буфера канала?

Если вы используете приведенный выше код для экспериментов, то скорость обработки данных ограничена выводом консоли Java, то есть вызовами System.out.println(). Я думаю, что если вы прокомментируете распечатку (только для тестирования), вы увидите, что Java довольно быстро расправляется с выводом Perl.

...