Обертка ProcessBuilder вокруг конвейерных команд с выводом - PullRequest
0 голосов
/ 14 апреля 2020

Попытка обернуть простую однострочную команду в Java ProcessBuilder:

yes | ffmpeg -i /Users/ME/My Stuff/VTS_01_4.VOB -c copy VTS_01_4.VOB.m4v

Я разбил проблемы на 3 части, по которым документы не очень понятны.

1: пробелы в аргументах могут быть плохими.

Я думаю, что ProcessBuilder.command должен их обрабатывать: если вы разбиваете команду на логические куски, она будет выходить внутри каждого блока.

val command = arrayOf("yes", "|", "ffmpeg", "-i", inputPathString, "-c", "copy", outputPathString)
val process = ProcessBuilder()
    .redirectErrorStream(true)
    .command(*command)
    .directory(workingDir)
    .start()!!

2: блокировка на вводе / выводе плохая

Если вы попытаетесь получить весь вывод с помощью process.inputStream.bufferedReader().readLines(), он не скажет вам, зависнет ли он, или если он ожидает ввода в середине. Однако, если вы попытаетесь получить вывод в том виде, в котором он был сгенерирован, он может застрять в ожидании строки. Уместно ли иметь блокировку на process.inputStream.bufferedReader().readLine() для получения каждой строки?

3: Трубы (yes |) плохие.

Не знаю, как решить эту проблему.

...