将管道应用的控制台文本捕获到另一个应用

时间:2010-02-28 13:00:34

标签: java exec pipe external-process

我很抱歉,如果标题很混乱,但我想知道是否有可能获得一个应用程序的标准输出管道输入到另一个应用程序中。

这是命令行。

sox -d -t wav - | lame - test.mp3

如果在bash中执行此操作,则为输出。

Input File     : '/dev/dsp' (ossdsp)
Channels       : 2
Sample Rate    : 48000
Precision      : 16-bit
Sample Encoding: 16-bit Signed Integer PCM

In:0.00% 00:00:25.00 [00:00:00.00] Out:1.20M [     -|=-    ]        Clip:0

最后一行由sox更新,直到用户发送SIGINT。

问题是,在java中,来自该进程的InputStream不会产生任何数据。但是如果我省略了sox的管道,sox -d -t wav test.wav,则InputStream会获取数据。我的问题是,控制台发生了什么?我怎样才能访问它。

1 个答案:

答案 0 :(得分:1)

当bash开始执行sox -d -t wav - | lame - test.mp3时,由于管道字符bash将分叉两个进程来执行每个命令,然后将stdout从第一个进程连接到stdin到第二个进程。 Bash不会对任一进程的stderr执行任何特定操作,因此您从sox(Input File ...)看到的屏幕输出不是管道操作的一部分。

从我的问题中我可以理解,你有一个java程序启动那两个sox和lame进程。关于你如何做这些的更多细节将是好的。但无论如何要获得屏幕输出,你都会看到你必须从sox过程中读取stderr的例子。