Захват консольного текста переданного приложения в другое приложение - PullRequest
0 голосов
/ 28 февраля 2010

Извините, если заголовок довольно запутанный, но мне интересно, возможно ли получить стандартный вывод приложения, переданного в другое приложение в java.

Вот командная строка.

sox -d -t wav - | lame - test.mp3

Если это выполняется в bash, это вывод.

Input File     : '/dev/dsp' (ossdsp)
Channels       : 2
Sample Rate    : 48000
Precision      : 16-bit
Sample Encoding: 16-bit Signed Integer PCM

In:0.00% 00:00:25.00 [00:00:00.00] Out:1.20M [     -|=-    ]        Clip:0

Последняя строка обновляется sox, пока пользователь не отправит SIGINT.

Проблема в том, что в java InputStream из этого процесса не производит никаких данных. Но если я опущу трубопровод от sox до lame, sox -d -t wav test.wav, InputStream получит данные. У меня вопрос, что случилось с консолью? Как я могу получить к нему доступ.

1 Ответ

1 голос
/ 28 февраля 2010

Когда bash начинает выполнять sox -d -t wav - | lame - test.mp3, из-за символа канала bash разветвляет два процесса для выполнения каждой команды, а затем подключает stdout из первого процесса со stdin ко второму. Bash не будет делать ничего конкретного с stderr любого из этих процессов, поэтому вывод экрана, который вы видите с помощью sox (Input File ...), не является частью операции pipe.

Из того, что я могу понять из вашего вопроса, у вас есть одна java-программа, которая запускает эти два процесса sox и lame. Было бы хорошо узнать больше о том, как вы это делаете. Но в любом случае, чтобы получить вывод на экран, который вы показали в качестве примера, вам нужно прочитать stderr из процесса sox.

...