Java 什么是线程安全的ByteArrayOutputStream?

Java 什么是线程安全的ByteArrayOutputStream?,java,groovy,Java,Groovy,我希望读取进程的输出和错误流,并将它们合并到一个文本流中。我的程序是用groovy编写的,如下所示: def mergeStream = new ByteArrayOutputStream() process.waitForProcessOutput(mergeStream, mergeStream) 问题是ByteArrayOutputStream不是线程安全的,waitForProcessOutput()生成两个附加到mergeStream的线程。我可以使用线程安全的变体吗?您还建议我如何

我希望读取进程的输出和错误流,并将它们合并到一个文本流中。我的程序是用groovy编写的,如下所示:

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

问题是ByteArrayOutputStream不是线程安全的,waitForProcessOutput()生成两个附加到mergeStream的线程。我可以使用线程安全的变体吗?您还建议我如何控制对mergeStream的访问?实际上,此实现有时会删除字符。

如果
进程.waitForProcessOutput()
输出流
作为参数,则只需使用其所有方法都已同步的
输出流
的自定义实现,并委托给包装的
ByteArrayOutputStream
的相应方法。就像
Collections.synchronizedList()
一样,将另一个列表包装到同步列表代理中

编辑:


也就是说,读取ByteArrayOutputStream的源代码时,它的所有方法都已经同步,因此它已经是线程安全的。您的错误可能来自其他地方。

您考虑过ProcessBuilder的redirectErrorStream吗?是的,它是线程安全的,或者说它的所有方法都是同步的,
ProcessBuilder.redirectErrorStream()
使您的整个问题变得多余。不是一个真正的问题。@EJP-如果你知道答案,这只是“不是一个真正的问题”——否则,这是一个很棒的问题!javadoc没有提到它正在被同步——AFAICT,你必须挖掘源代码才能找到它,如果你没有评论的话,我永远不会费心(假设它不是线程安全的,因为doc没有说什么)。