Я не могу быть уверен, я думаю, проблема в вашем методе inputStreamToStringValue(is)
. Он читает STDERR и блокирует чтение. Когда ему нечего читать из STDERR, но процесс еще не завершен, вы будете заблокированы навсегда.
Я бы порекомендовал вам использовать ProcessBuilder:
ProcessBuilder b = new ProcessBuilder();
b.redirectErrorStream(true);
Теперь вы можете читать STDIN и STDERR вместе.
Если вы все еще хотите прочитать их отдельно, у вас есть 2 решения.
Сначала делайте так, как вы делаете сейчас, но не блокируйте чтение, т. Е. Вызывайте in.available()
перед каждым вызовом чтения, а затем читайте только количество байтов, которые были ранее доступны.
Второй способ - использовать перенаправление оболочки. Запустите ваш скрипт и перенаправьте его STDOUT и STDERR во временные файлы. Затем подождите, пока ваш процесс не прекратится, и затем прочитайте из файлов. Я лично считаю, что это решение проще и надежнее.
Удачи.