Лучший способ контролировать вывод процесса вместе с его выполнением - PullRequest
0 голосов
/ 20 июля 2010

Я запустил процесс в своем Java-коде, этот процесс занимает очень много времени и может время от времени генерировать какой-то вывод. Мне нужно реагировать на каждый вывод, когда они генерируются, каков наилучший способ сделать это?

Ответы [ 2 ]

1 голос
/ 20 июля 2010

Вы должны запустить поток, который читает из Process.getInputStream() и getErrorStream() (или альтернативно использовать ProcessBuilder.redirectErrorStream(true)), и обрабатывать его, когда что-то появляется в потоке.Есть много способов, как справиться с этим - правильный путь зависит от того, как используются данные.Пожалуйста, расскажите подробнее.

Вот один пример из реальной жизни: SbtRunner использует ProcessRunner для отправки команд приложению командной строки и ожидания ее завершения.(приложение выведет «>», когда команда завершит выполнение).Происходит некоторая косвенность, облегчающая чтение из выходных данных процесса (выходные данные записываются в MulticastPipe , откуда они затем считываются OutputReader ).

1 голос
/ 20 июля 2010

О какой реакции вы говорите? Процесс записывает на свой стандартный вывод и / или стандартную ошибку? Если так, я подозреваю, что Process.getInputStream и Process.getErrorStream - это то, что вы ищете. Прочитайте оба из них и реагируйте соответственно. Обратите внимание, что вы можете прочитать оба из разных потоков, чтобы избежать заполнения отдельного буфера для любого потока.

В качестве альтернативы, если вам не нужны оба параметра по отдельности, просто оставьте redirectErrorStream в ProcessBuilder как false, чтобы потоки ошибок и выходных данных были объединены.

...