2010-02-28 72 views
0

如果标题相当混乱,但我想知道是否有可能获取将应用程序导入到另一个应用程序的标准输出。将管道应用程序的控制台文本捕获到另一个应用程序

这里是命令行。

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的管道以防止跛行,则InputStream将获取数据。我的问题是,控制台发生了什么事?我怎样才能访问它。

+0

你是如何使用Java来执行这个命令的? '的Runtime.exec()'? 'ProcessBuilder'? – 2010-02-28 13:32:02

回答

1

当bash开始执行sox -d -t wav - | lame - test.mp3,因为管道字符的bash将叉两个过程来执行各命令,然后从第一处理标准输出连接与标准输入到第二个。 Bash不会执行任何与stderr相关的任何操作,所以从sox(Input File ...)中看到的屏幕输出不是管道操作的一部分。

从我的问题可以理解,你有一个Java程序,启动这两个sox和跛脚过程。关于你如何做这件事的更多细节会很好。但是在任何情况下,为了获得屏幕输出,您展示了必须从sox进程读取stderr的示例。

+0

嗯,现在我可以读取控制台了,但从stderr,我必须使用CMD/C 从它流。我想这回答我的问题 – ken 2010-02-28 14:25:59

+0

哦,跟进问题。现在我不能杀死产卵的sox。 process.destroy不起作用 – ken 2010-02-28 14:28:42

相关问题