| grep ...
не использует выходные данные команды, как вы ожидаете, потому что getRuntime().exec
не понимает символы трубопровода.Процесс застревает в ожидании чего-то, что потребляет его выходные данные и его переданные фиктивные аргументы командной строки "|"
, "grep"
и "albumId"
.
Оболочка поймет |
но execv
не будет, поэтому вам нужно вместо этого использовать bash -c
, чтобы получить оболочку для выполнения конвейера (см. оболочка Java для выполнения / координации процессов? выполнить конвейер самостоятельно (см. * 1015)* Труба между процессами Java в командной оболочке не надежно работает ). Java 7 имеет новый класс ProcessBuilder
, который упрощает настройку каналов, поэтому вы можете использовать их, если вы только выполняетена переднем крае JVM.
После запуска grep
, если есть несколько совпадающих строк, он все равно может заполнить буфер, поэтому вам нужно что-то сидеть в буфере, потребляя процессвыходной поток. Перемещение
albumProcess.waitFor();
после цикла while
должно сделать это.