2012-10-31 81 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可能来自其他地方。

相关问题