Запуск команды Unix в Java - PullRequest
       2

Запуск команды Unix в Java

0 голосов
/ 11 августа 2011

Я запускаю следующий код, и он останавливается на функции waitfor().В чем может быть причина и как я могу ее решить?

String line;
Process albumProcess;
try {
  albumProcess = Runtime.getRuntime().exec(
    "iconv -f UTF-16 -t UTF-8 /home/gozenem/"+ xmlFileName +
    ".xml | grep albumID");
  albumProcess.waitFor();
  BufferedReader in = new BufferedReader(
      new InputStreamReader(albumProcess.getInputStream()));
  ArrayList<String> lineList = new ArrayList<String>(); 
  while ((line = in.readLine()) != null) {  
    lineList.add(line);
  }
  result[0] = lineList.size();
  albumProcess.destroy();

} catch (Exception e) {}

Ответы [ 2 ]

2 голосов
/ 11 августа 2011

| grep ... не использует выходные данные команды, как вы ожидаете, потому что getRuntime().exec не понимает символы трубопровода.Процесс застревает в ожидании чего-то, что потребляет его выходные данные и его переданные фиктивные аргументы командной строки "|", "grep" и "albumId".

Оболочка поймет | но execv не будет, поэтому вам нужно вместо этого использовать bash -c, чтобы получить оболочку для выполнения конвейера (см. оболочка Java для выполнения / координации процессов? выполнить конвейер самостоятельно (см. * 1015)* Труба между процессами Java в командной оболочке не надежно работает ). Java 7 имеет новый класс ProcessBuilder, который упрощает настройку каналов, поэтому вы можете использовать их, если вы только выполняетена переднем крае JVM.

После запуска grep, если есть несколько совпадающих строк, он все равно может заполнить буфер, поэтому вам нужно что-то сидеть в буфере, потребляя процессвыходной поток. Перемещение

albumProcess.waitFor();

после цикла while должно сделать это.

1 голос
/ 11 августа 2011

Я думаю, вы должны попытаться прочитать выходные данные процесса, прежде чем ждать его.В противном случае, если команда выводит много, буфер может быть заполнен.

Посмотрите эту статью, в которой объясняется, как читать из процесса: http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html?page=4

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...