Java Can';我不理解管道输入流

Java Can';我不理解管道输入流,java,io,Java,Io,我试图理解管道流。 为什么我们不能用其他流来代替管道流呢?如下图所示: final ByteArrayOutputStream pos = new ByteArrayOutputStream(); final ByteArrayInputStream pis = new ByteArrayInputStream(pos.toByteArray()); 在管道流中何时会出现死锁?我尝试使用单个主线程进行读写,但它执行得很顺利。这里的困难在于必须在多个线程中实现该过程,因为写入管道一端必须与另一

我试图理解管道流。 为什么我们不能用其他流来代替管道流呢?如下图所示:

final ByteArrayOutputStream pos = new ByteArrayOutputStream();

final ByteArrayInputStream pis = new ByteArrayInputStream(pos.toByteArray());

在管道流中何时会出现死锁?我尝试使用单个主线程进行读写,但它执行得很顺利。

这里的困难在于必须在多个线程中实现该过程,因为写入管道一端必须与另一端的读取相匹配

当然,创建一个线程来监视一个管道末端的到达并将它们推回另一个管道并不困难,但这不能用一个线程来完成


您看过问题了吗?

管道流允许最小的工作量进行高效的逐字节处理

我很可能是错的,但我相信
toByteArray()
可能做不到您认为它能做的事情。它只是复制当前的内容,而不是将来的任何内容

所以这里唯一真正的问题是管理,这会有点困难。您必须不断轮询输出流。更不用说为每个调用
toByteArray
(每个调用都有一个数组)分配内存了

我如何怀疑死锁可能发生在单个线程中:

如果您试图(阻止)读取尚未包含数据的输入流。它永远无法获取数据,因为数据只能从输出流中获取,而输出流必须在同一线程中写入,这在您坐着等待数据时是不可能发生的

因此,在单个线程中,如果您不十分小心,就会发生这种情况,但是在同一个线程中成功地使用它们应该是可能的,而不会出现死锁,但是您为什么要这样做呢?我认为另一种数据结构可能更适合,比如链表或简单的圆形数组