2012-02-15 59 views
2

我知道如何从InputStream将chunkwise复制到OutputStream将数据从InputStream复制到OutputStream +在末尾获取字节[]

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

但如何将它们一步到位?是否有一个可以传送的OutputStream 缓冲所有写入的字节,因此它可以在最后返回一个字节[]?

我需要类似ByteArrayOutputStream的东西,但可以通过管道连接。 (例如到FileOutputStream)

或者我需要类似MultiOutputStream的东西,它可以转发到多个OutputStreams。 使用番石榴和/或Apache Commons的解决方案是首选。 :)

回答

6
+0

+1好收获。永远不会猜到这个Stream的名字。 :-) – 2012-02-15 09:55:54

+0

检查TeeOutputStream的实现,当主流在close()调用时抛出Throwable(例如IOException)时,它无法关闭分支流。我写了自己的MultiOutputStream,稍后我会将它上传到GitHub。 – 2012-02-16 18:13:43

+0

这就是为什么链接只回答吸吮,链接已死 – 2016-06-20 16:21:32

1

扩展OutputStream并通过在两个内部流(ByteArrayOutputStream和FileOutputStream)上包装(如装饰器)来创建自定义的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); 
    } 

    ... 
    ... 
} 
+0

+1当然,有效的答案。但我仍然希望我不必自己写一本。 – 2012-02-15 09:45:27

1

我考虑过使用TeeOutputStream,但它的close() - 关闭主流时,抛出时,方法缺乏关闭支流例外。 因此,当发生异常时,我必须自行关闭分支流。由于java流链的概念,这是非常不切实际的。 由于这种行为至少没有记录在案,我把这称为bug

当我将ByteArrayOutputStream用作TeeOutputStreams分支到的其中一个流时,这并不是真正的问题。但这只是因为ByteArrayOutputStreams一定不能关闭。

这就是为什么我写了MultiOutputStream。它与TeeOutputStream非常相似,但即使在两者之间引发异常时,也会继续关闭它的基础流。此外,它允许多个分支流而不仅仅是一个。

编辑
在TeeOutputStream的错误今天是固定的。它将与Commons IO 2.2一起发布。

相关问题