Chunkwise-Copy数据从InputStream到OutputStream +最后得到byte []

时间:2012-02-15 09:26:33

标签: java stream guava apache-commons

我知道如何将chunkwise从InputStream复制到OutputStream

我知道如何从byte[]获得InputStream

但是如何一步到位呢?是否有一个OutputStream可以通过管道传输缓冲所有写入的字节,以便它可以在结尾处返回一个byte []?

我需要像ByteArrayOutputStream这样的东西,但可以用管道输送。{p> (例如,到FileOutputStream)

或者我需要像MultiOutputStream这样可以转发到多个OutputStream的东西。 使用Guava和/或Apache Commons的解决方案是首选。 :)

3 个答案:

答案 0 :(得分:6)

答案 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一起发布。