Java 从Apache exec commons获取并解析输出流

Java 从Apache exec commons获取并解析输出流,java,apache,apache-commons,apache-commons-exec,Java,Apache,Apache Commons,Apache Commons Exec,我正在尝试使用avconv捕获IP Cam的流。我已成功获取该流,并使用apache exec commons Java库将其保存到一个文件中,如下所示: DefaultExecuteResultHandler resultHandler = new DefaultExecuteResultHandler(); String str = avconv_command; CommandLine commandLine = CommandLine.parse(str); ExecuteWatchd

我正在尝试使用avconv捕获IP Cam的流。我已成功获取该流,并使用apache exec commons Java库将其保存到一个文件中,如下所示:

DefaultExecuteResultHandler resultHandler = new DefaultExecuteResultHandler();
String str = avconv_command; 
CommandLine commandLine = CommandLine.parse(str);
ExecuteWatchdog watchdog = new ExecuteWatchdog(1000000);
Executor executor = new DefaultExecutor();
executor.setWatchdog(watchdog);
executor.execute(commandLine, resultHandler);
这样,avconv开始捕获流并将其保存到文件中,在控制台上,我可以看到avconv如何工作以及流程的输出。该输出的每一行都显示当前捕获的视频的持续时间、比特率等。我需要捕获该输出并在其运行时对其进行处理。有什么想法吗

我读过很多帖子:


但它们都是在进程完成时读取输出的,我需要在进程运行时读取输出。

通过以下方法解决了这个问题:

ByteArrayOutputStream os = new ByteArrayOutputStream();
PumpStreamHandler ps = new PumpStreamHandler(os);
DefaultExecuteResultHandler resultHandler = new DefaultExecuteResultHandler();
String str = avconv_command; 
CommandLine commandLine = CommandLine.parse(str);
ExecuteWatchdog watchdog = new ExecuteWatchdog(1000000);
Executor executor = new DefaultExecutor();
executor.setWatchdog(watchdog);
executor.setStreamHandler(ps);
executor.execute(commandLine, resultHandler);
Reader reader = new InputStreamReader(new ByteArrayInputStream(os.toByteArray()));
BufferedReader r = new BufferedReader(reader);
String tmp = null;
while ((tmp = r.readLine()) != null) 
{
     //Do something with tmp line
}

因此,我将输出更改为ByteArrayOutputStream,然后读取该输出。此块必须位于循环内,以便字节数组可以更新从进程输出生成的内容。

将其计算出来。。回答如下