Chunkwise将数据从InputStream复制到OutputStream+在末尾获取byte[]



我知道如何从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一起发布。

相关内容

  • 没有找到相关文章

最新更新