【问题标题】:Can't understand piped inputstream无法理解管道输入流
【发布时间】:2013-04-17 13:22:34
【问题描述】:

我正在尝试理解管道流。 为什么我们不能使用其他流来相互管道而不是管道流?如下:

final ByteArrayOutputStream pos = new ByteArrayOutputStream();

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

我们什么时候会在管道流中出现死锁?我尝试使用单个主线程进行读写,但执行起来很流畅。

【问题讨论】:

    标签: java io


    【解决方案1】:

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

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

    你看过this的问题吗?

    【讨论】:

      【解决方案2】:

      管道流允许高效最少的努力进行逐字节处理。

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

      所以这里唯一真正的问题是管理这个,这会有点困难。您必须不断地轮询输出流。更不用说每次调用toByteArray(每次调用"Creates a newly allocated byte array")的数组内存分配。

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

      如果您尝试(阻塞)从尚无数据的输入流中读取。它将永远无法获取数据,因为只能从必须在同一个线程中写入的输出流中获取数据,而这在您等待数据时不会发生。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-21
        • 1970-01-01
        • 1970-01-01
        • 2010-09-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多