Java.lang.Process将errorstream重定向到/ dev / null

时间:2012-03-23 10:47:41

标签: java bash process

我启动了一个Process(通过java.lang.Runtime #exec,在Java 6,Linux上),我只需要stdout。不幸的是,我运行的程序(ffmpeg)坚持用进度信息搞乱stderr。如果我不时地从stderr读取,stderr缓冲区会填满,过程会暂时停止...

基本上我想要的是丢弃stderr的任何输出。我的建议

1)

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

这有效,但意味着我必须执行exec(String)而不是exec(String []),这意味着我必须转义我的参数,因为Java中没有标准函数。我可以建立一个,但不喜欢。

2)

在包装器脚本中使用上述ffmpeg命令,将输出重定向到/ dev / null。听起来不错,但仅仅为此设置一个bash脚本似乎有点矫枉过正。

3)

同时附加ErrorStream,启动一个除了errorstream上的read()之外什么都不做的线程。会工作,但看起来很乱......

4) 使用Apache Commons Exec ...我甚至没有检查文档以查看这是否有效,但仅为这么简单的任务导入整个库也感觉不对。

基本上我的问题是:有更好的方法吗?如果没有,你认为哪一个[打击]最美丽[/ strike]最难看?

3 个答案:

答案 0 :(得分:2)

在这些选项中,第3个 - 创建一个线程来读取错误流 - 可能是最好的。

编写自己的解析器将是一项相当多的工作,并且将成为不必要的错误来源。使用包装器脚本会产生额外的不必要的依赖关系,即另一个潜在的问题来源。当你已经有一个只有几行简单代码的解决方案时,我不会看到使用新库。

答案 1 :(得分:0)

您可以使用Overthere代替Apache Commons Exec。它支持(本地)流程执行。并为你吞噬stdout和stderr。

答案 2 :(得分:0)

您可以使用ProcessBuilder并将stderr重定向(redirectErrorStream(true))到stdout,然后您只需要读取一个流的输出。这可能会使任何输出解析你做得有点困难。一个好处是这是一个Java类,不需要外部库。