PipedInputStream
和PipedOutputStream
用于线程间数据传输。 “一个线程从PipedInputStream
对象读取数据,并通过其他线程将数据写入相应的PipedOutputStream
。”
到目前为止,这么好。我从这个范例中看到的一个潜在好处是,零散的生产者(OutputStream
)不需要被缓慢的消费者(InputStream
)放慢速度。换句话说,当OutputStream
突然产生消费者无法立即消费的大量数据时,OutputStream
不需要等待生成的数据被完全消耗在继续生活之前。
如果问题1的答案是肯定的,那么:
当缓冲区未满时,这很有效,但是当缓冲区已满时,在JDK6的实现中,PipedOutputStream会阻塞并等待更多空间释放。这打败了我上面提到的目的,不是吗?
通过在等待新空间分配更大缓冲区的完全bufferes的情况下改变行为,似乎很容易解决这个问题。我可以在几分钟内实现一个,但是如果那里有类似的东西,我不想重新发明轮子。我搜索了很多,但是找不到任何东西,这对我来说非常令人惊讶。
有人能指出我正确的方向吗?或者指出我的想法在哪里错了?
由于
答案 0 :(得分:3)
PipedOutputStream实际上不是以这种方式缓冲结果(缓冲在其实现中更多的是副作用)。正如Javadoc所说:
“管道输入流包含缓冲区,解耦读取操作 来自写作操作,在限制范围内。“
对于以您描述的方式进行缓冲,我倾向于使用http://download.oracle.com/javase/6/docs/api/java/util/concurrent/LinkedBlockingQueue.html。
答案 1 :(得分:0)
我认为PipedOutputStream没有关于缓冲输出的任何保证,直到PipedInputStream准备就绪。所以,答案是否定的,尽管在实践中你可能会注意到一些缓冲。
编辑:尝试搜索术语“循环缓冲区”。不知道有一个副手,但这是这类案件的通用名称。