ProcessBuilder не выводит правильный вывод - PullRequest
0 голосов
/ 12 ноября 2018
private void printNumberOfRecords(){
   try {
      ProcessBuilder builder = new ProcessBuilder(
         "/bin/sh", "-c",
         "grep", "\"target-word\"", localFileName, "|", "wc", "-l");
      Process p = builder.start();
      p.waitFor();
      BufferedReader br=new BufferedReader(
         new InputStreamReader(
            p.getInputStream()));
      String line;
      while(( line = br.readLine()) != null ) {
         System.out.println(line);
      }
   }
   catch( Exception e ) {
      e.printStackTrace();
   }
}

Итак, у меня есть следующий код. Читает файл и подсчитывает количество вхождений целевого слова и печатает счет. Но когда я запускаю эту функцию, я не вижу ничего напечатанного.

1 Ответ

0 голосов
/ 12 ноября 2018

Ваш код просит Java дождаться окончания подпроцесса sh без чтения потока.Когда буфер заполнится, подпроцесс ожидает, заблокирован.

Не используйте p.waitFor();, пока не прочитаете вывод.Выходной поток будет закрыт по окончании процесса.

Чтобы завершиться, вы должны также проверить поток ошибок.

Как заметил Андреас, попытка с ресурсом будет лучше.

...