Java.lang.Process перенаправляет поток ошибок в / dev / null - PullRequest
4 голосов
/ 23 марта 2012

Я запустил процесс (через java.lang.Runtime # exec, на Java 6, Linux), для которого мне нужен только стандартный вывод. К сожалению, программа, которую я запускаю (ffmpeg), настаивает на загромождении stderr информацией о прогрессе. Если я не читаю из stderr время от времени, буфер stderr заполняется, и через некоторое время процесс останавливается ..

По сути, я хочу отказаться от любого вывода из stderr. Мои предложения

1)

ffmpeg -i .... .... 2>/dev/null

Это работает, но означает, что мне нужно выполнить exec (String) вместо exec (String []), что означает, что я должен экранировать свои параметры, для которых в Java нет стандартной функции. Я мог бы построить один, но предпочел бы нет.

2)

Используйте приведенную выше команду ffmpeg в скрипте-оболочке, который перенаправляет вывод в / dev / null. Звучит хорошо, но сценарий bash только для этого кажется излишним.

3)

Также присоедините ErrorStream, запустите поток, который ничего не делает, кроме read () в потоке ошибок. Будет работать, но выглядит грязно ....

4) Используйте Apache Commons Exec ... Я даже не проверял документацию, чтобы посмотреть, сработает ли это, но импортировать всю эту библиотеку только для такой простой задачи тоже не подходит.

Итак, в основном мой вопрос: есть ли лучший способ сделать это? Если нет, то какой из них вы бы назвали [поразить] самым красивым [/ поразить] наименее уродливым?

Ответы [ 3 ]

2 голосов
/ 23 марта 2012

Из этих вариантов номер 3 - создание потока для чтения потока ошибок - возможно, является лучшим.

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

0 голосов
/ 23 марта 2012

Вы можете использовать ProcessBuilder и перенаправить (redirectErrorStream (true)) stderr на стандартный вывод, тогда вам нужно только прочитать выходные данные одного потока. Это может сделать любой выходной анализ немного сложнее. Одним из преимуществ является то, что это класс Java, внешние библиотеки не требуются.

0 голосов
/ 23 марта 2012

Вместо Apache Commons Exec вы также можете использовать Overhere .Это поддерживает (локальный) процесс выполнения.И сожрет и stdout, и stderr для вас.

...