【发布时间】:2012-03-23 10:47:40
【问题描述】:
我启动了一个进程(通过 java.lang.Runtime#exec,在 Java 6、Linux 上),我只需要标准输出。不幸的是,我运行的程序(ffmpeg)坚持使用进度信息来混淆标准错误。如果我不时不时从 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... 我什至没有检查文档以查看这是否可行,但是仅仅为了这样一个简单的任务导入整个库也感觉不对。
所以基本上我的问题是:有没有更好的方法来做到这一点?如果不是,你认为哪个[strike]最漂亮[/strike]最不丑?
【问题讨论】:
-
如果你在进程启动后简单地关闭错误流会发生什么 - 因此,告诉操作系统“我不想要进程正在写的东西,把它扔掉”。
-
有趣的想法。只是把它进行测试,不幸的是它有同样的问题。过了一会儿它就停止了,我只能将其归因于 stderr 上的完整缓冲区。
-
更正我之前的评论:获取错误流并直接关闭它只会杀死子进程。