2012-03-23 115 views
4

我啓動了一個Process(通過java.lang.Runtime#exec,在Java 6,Linux上),爲此我只需要stdout。不幸的是,我運行的程序(ffmpeg)堅持使用進度信息來糾正錯誤。如果我不立刻從stderr讀取,stderr緩衝區會填滿,並且過程在一段時間後停頓。Java.lang.Process將errorstream重定向到/ dev/null

基本上我想要的是放棄stderr的任何輸出。我的建議

1)

ffmpeg -i .... .... 2>/dev/null 

這工作,但意味着我必須給exec(字符串)在EXEC代替(字符串[]),這意味着我必須逃離我的參數,其中有在Java中沒有標準功能。我可以建立一個,但不喜歡。

2)

在一個包裝腳本,重定向輸出到/ dev/null使用上述FFMPEG命令。聽起來沒問題,但有一個bash腳本只是爲了這個似乎矯枉過正。

3)

附上ErrorStream爲好,啓動一個線程,什麼也不做,但閱讀()在errorstream。將工作,但看起來凌亂....

4) 使用Apache公共Exec ...我甚至沒有檢查文檔,看看這會工作,但導入整個庫只是爲了這麼簡單的任務也不覺得正確。

所以基本上我的問題是:有沒有更好的方法來做到這一點?如果不是,你認爲哪一個[最棒]最難看?

+1

如果您在進程啓動後簡單地關閉錯誤流,會發生什麼情況 - 因此,告訴操作系統「我不希望進程正在寫入,將其丟棄」。 – Dunes 2012-03-23 12:09:57

+0

有趣的想法。只是把它放在測試中,不幸的是它有同樣的問題。一段時間後,它只停下來,我只能將屬性指向stderr上的完整緩衝區。 – Claude 2012-03-23 14:49:55

+0

糾正我以前的評論:採取errorstream並直接關閉它只是殺死子進程。 – Claude 2012-03-23 16:18:29

回答

2

在這些選項中,編號3 - 創建線程來讀取錯誤流 - 可能是最好的。

編寫你自己的解析器將會是一個相當大的工作,並且會成爲不必要的錯誤來源。使用包裝腳本會創建額外的不必要依賴項,即另一個潛在的問題源。當你已經有一個只有幾行簡單代碼的解決方案時,我沒有看到使用新的庫。

+0

有趣的是,這也是我自己的選擇,很高興看到其他人同意。作爲獎勵,我可以保存stderr的最後1kb而不是丟棄所有內容。所以當事情破裂時,我仍然會有錯誤信息。 – Claude 2012-03-23 14:53:06

0

除了Apache Commons Exec,您還可以使用Overthere。它支持(本地)流程執行。並且爲你輸掉stdout和stderr。

+0

感謝您的鏈接,但它也有同樣的問題。我不想介紹另一個庫(也不得不查閱文檔)。這是一個很好的記住,可能的未來項目,雖然... – Claude 2012-03-23 14:51:12

0

你可以使用ProcessBuilder和重定向(redirectErrorStream(真))標準錯誤到標準輸出,那麼你只需要讀取一個數據流的輸出。這可能會讓你輸出的解析有點困難。一個好處是這是一個Java類,不需要外部庫。

+0

謝謝,不幸的是我從標準輸入讀取轉碼後的音頻流。將它與stdout上的消息區分開是不可能的。 – Claude 2012-03-23 11:05:02

相關問題