2010-02-28 71 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

相關問題