我知道如何从InputStream
分块复制到OutputStream
。
我知道如何从InputStream
中获得byte[]
。
但是如何将它们结合在一起呢?是否有一个OutputStream可以通过管道和缓冲所有写入的字节,以便在结尾返回一个字节[]?
我需要一个类似ByteArrayOutputStream
的东西,但它可以用管道连接。(例如到FileOutputStream)
或者我需要一个类似MultiOutputStream
的东西,它可以转发到多个OutputStreams。首选使用Guava和/或Apache Commons的解决方案。:)
您可能应该了解一下Apache的TeeOutputStream
:https://commons.apache.org/proper/commons-io/javadocs/api-2.5/org/apache/commons/io/output/TeeOutputStream.html
扩展OutputStream,并通过在两个内部流(ByteArrayOutputStream和FileOutputStream)上封装(像decorator一样)来创建自定义的MultiOutputStream。您可以将这两个流都作为构造函数参数。覆盖适当的写入方法并同时写入两个目标流。
例如类似的东西
class MultiOuputStream extends OutputStream {
private OutputStream stream1;
private OutputStream stream2;
public MultiOuputStream(){
// can throw exception, not supported
}
public MultiOuputStream(OutputStream stream1, OutputStream stream2){
this.stream1 = stream1;
this.stream2 = stream2;
}
@Override
public write(byte[] bytes) throws IOException {
stream1.write(bytes);
stream2.write(bytes);
}
...
...
}
我考虑过使用TeeOutputStream,但它的close()-方法在关闭主流时没有关闭分支流,从而引发异常。因此,当出现异常时,我必须自己关闭分支流。由于java的流链接的概念,这是非常不切实际的。由于这种行为至少没有记录在案,我称之为bug。
当我使用ByteArrayOutputStream作为TeeOutputStreams分支到的流之一时,这并不是一个真正的问题。但这只是因为ByteArrayOutput streams不能关闭。
这就是我写MultiOutputStream的原因。它与TeeOutputStream非常相似,但即使在两者之间出现异常,它也会继续关闭其底层流。此外,它允许多个分支流,而不仅仅是一个。
编辑
TeeOutputStream中的错误今天已修复。它将与Commons IO 2.2一起发布。