我知道如何将chunkwise从InputStream
复制到OutputStream
。
我知道如何从byte[]
获得InputStream
。
但是如何一步到位呢?是否有一个OutputStream可以通过管道传输和缓冲所有写入的字节,以便它可以在结尾处返回一个byte []?
我需要像ByteArrayOutputStream
这样的东西,但可以用管道输送。{p> (例如,到FileOutputStream)
或者我需要像MultiOutputStream
这样可以转发到多个OutputStream的东西。
使用Guava和/或Apache Commons的解决方案是首选。 :)
答案 0 :(得分:6)
您应该查看Apache的TeeOutputStream
:https://commons.apache.org/proper/commons-io/javadocs/api-2.5/org/apache/commons/io/output/TeeOutputStream.html
答案 1 :(得分:1)
扩展OutputStream并通过在两个内部流(ByteArrayOutputStream和FileOutputStream)上包装(如decorator)来创建自定义MultiOutputStream。您可以将两个流作为构造函数args。覆盖相应的写入方法并写入两个目标流。
e.g。
之类的东西 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);
}
...
...
}
答案 2 :(得分:1)
我考虑使用TeeOutputStream,但是它的close() - Method在关闭主流时没有关闭分支流抛出异常。 因此,当发生异常时,我必须自己关闭分支流。由于java的流链接的概念,这是非常不切实际的。 由于这种行为至少没有记录,我称之为bug。
当我使用ByteArrayOutputStream作为TeeOutputStreams分支到的流之一时,这不是一个真正的问题。但这只是因为ByteArrayOutputStreams不能被关闭。
这就是我写MultiOutputStream的原因。它与TeeOutputStream非常相似,但即使在两者之间出现异常时也会关闭其底层流。此外,它允许多个分支流,而不仅仅是一个。
修改强>
今天修复了TeeOutputStream中的错误。它将与Commons IO 2.2一起发布。