2012-10-31 80 views
8

我想讀取進程的輸出和錯誤流,並將它們合併爲一個文本流。我的計劃是在Groovy和讀取這樣的:什麼是線程安全的ByteArrayOutputStream?

def mergeStream = new ByteArrayOutputStream() 
process.waitForProcessOutput(mergeStream, mergeStream) 

的問題是,ByteArrayOutputStream不是線程安全和waitForProcessOutput()產生兩個線程,其追加到mergeStream。是否有可以使用的線程安全變體?你還建議我如何控制對mergeStream的訪問?看起來實際上字符有時會隨着這個實現而被放棄。

+2

您是否考慮過ProcessBuilder的redirectErrorStream? – artbristol

+0

是的,它*是*線程安全的,或者說它的所有方法都是同步的,'ProcessBuilder.redirectErrorStream()'使你的整個問題變得冗餘。不是一個真正的問題。 – EJP

+1

@EJP - 如果你知道答案,它只是「不是一個真正的問題」 - 否則,這是一個偉大的問題! javadoc沒有說它是同步的 - AFAICT,你必須挖掘來源找出來,並且我沒有打擾過(假設它不是線程安全的,因爲文檔沒有說什麼),你沒有評論。 –

回答

7

如果process.waitForProcessOutput()需要一個OutputStream作爲參數,你可以簡單地使用的OutputStream自定義實現,有它的所有方法同步,並委託給一個包裹ByteArrayOutputStream的相應方法。就像Collections.synchronizedList()將另一個列表包裝到一個同步的List代理中。

編輯:

這就是說,讀ByteArrayOutputStream的來源,所有的方法都已經同步,所以它已經是線程安全的。你的bug可能來自其他地方。

相關問題