Как только подпроцесс выдает больше выходных данных, чем возможность буферизации канала, он будет заблокирован, пока инициирующий процесс не прочитает данные. Когда вы ожидаете окончания подпроцесса перед чтением чего-либо, это может привести к тупику.
Поскольку вы только читаете вывод, чтобы перепечатать его на консоль (или вообще, пишете в stdout), вы может использовать ProcessBuilder
, чтобы запретить использовать канал, но подключить подпроцесс 'stdio к вашему процессу' stdio:
Process pb = new ProcessBuilder("java", "-jar", "path/to/jar").inheritIO().start();
pb.waitFor();
Тогда вам не нужно ничего делать для передачи вывода подпроцесса на выходе вашего процесса, и нет никакого тупикового потенциала.
inheritIO()
делает волхвы c. Это сокращение для .redirectInput(Redirect.INHERIT) .redirectOutput(Redirect.INHERIT) .redirectError(Redirect.INHERIT)
. Эти redirect…
вызовы также можно использовать для настройки отдельных каналов для использования канала или чтения / записи в файл.