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

Java.lang.Process将errorstream重定向到/dev/null,java,bash,process,Java,Bash,Process,我启动了一个进程(通过java.lang.Runtime#exec,在Java6和Linux上),我只需要标准输出。不幸的是,我运行的程序(ffmpeg)坚持用进度信息将stderr弄乱。如果我不时不时地从stderr读取数据,则stderr缓冲区会被填满,并且进程会在一段时间后暂停 基本上我想要的是丢弃stderr的任何输出。我的建议 (一) 这是可行的,但意味着我必须执行(String)而不是exec(String[]),这意味着我必须转义我的参数,因为Java中没有标准函数。我可以造一个,

我启动了一个进程(通过java.lang.Runtime#exec,在Java6和Linux上),我只需要标准输出。不幸的是,我运行的程序(ffmpeg)坚持用进度信息将stderr弄乱。如果我不时不时地从stderr读取数据,则stderr缓冲区会被填满,并且进程会在一段时间后暂停

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

(一)

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

(二)

在包装器脚本中使用上述ffmpeg命令,将输出重定向到/dev/null。听起来不错,但是仅仅为了这个而编写bash脚本似乎有些过分了

(三)

附加ErrorStream,启动一个线程,该线程只对ErrorStream执行read()操作。可以,但看起来很乱

(四) 使用ApacheCommons。。。我甚至没有检查文档以确定这是否可行,但是仅仅为了这么简单的任务导入整个库也感觉不太对


所以基本上我的问题是:有没有更好的方法?如果不是,哪一个你认为[罢工]最漂亮/(罢工)最丑陋?< / P > P >这些选项,3号-创建一个线程来读取错误流-可能是最好的。
编写您自己的解析器将是相当多的工作,并且将是不必要的bug来源。使用包装器脚本会产生额外的不必要的依赖关系,即另一个潜在的问题源。当您已经有了一个只需几行简单代码的解决方案时,我认为不需要使用新的库。

您也可以使用Apache Commons Exec来代替它。It支持(本地)流程执行。您可以使用并重定向(redirectErrorStream(true))stderr到stdout,然后只需读取一个流的输出。这可能会使您所做的任何输出解析都稍微困难一些。一个好处是,这是一个Java类,不需要外部LIB。

谢谢,不幸的是,我从stdin读取了转码音频流。无法将其与标准输出上的消息区分开来。如果在进程启动后关闭错误流会发生什么?因此,告诉操作系统“我不想要进程正在编写的内容,请扔掉它”。有趣的想法。只是测试一下,不幸的是它也有同样的问题。过了一会儿,它就停止了,这只能归因于stderr上的缓冲区已满。更正我之前的评论:获取错误流并直接关闭它只会杀死子进程。感谢链接,它也有同样的问题。我不想再介绍另一个图书馆(并且不得不翻阅文档)。不过,对于未来可能的项目,这是一个很好的选择……有趣的是,这也是我自己的选择,很高兴看到其他人同意。作为奖励,我可以保存最后1kb的stderr,而不是丢弃所有的stderr。所以当事情破裂时,我仍然会收到错误信息。
ffmpeg -i .... .... 2>/dev/null