我有两个线程。其中一个写入PipedOutputStream,另一个从相应的PipedInputStream读取。背景是,一个线程正在从远程服务器下载一些数据,并通过管道流将其多路复用到其他几个线程。PipedInputStream - 如何避免“java.io.IOException:管道损坏”
的问题是,有时(特别是下载大(> 50MB的时候)文件)我得到产生java.io.IOException:管道试图从的PipedInputStream读取时坏。
Javadoc说A pipe is said to be broken if a thread that was providing data bytes to the connected piped output stream is no longer alive.
确实,我的写作线程在将所有数据写入PipedOutputStream后真的死亡。
任何解决方案?我怎样才能防止PipedInputStream抛出这个异常?即使写作线程完成了他的工作,我也希望能够读取写入PipedOutputStream的所有数据。 (如果有人知道如何继续写入线程直到读取所有数据,这个解决方案也可以接受)。
不错的功能,它肯定是+1,但它需要在不同线程之间共享一个CountDownLatch实例。这不太好,因为写作和阅读主题是在不同的地方创建的,我希望他们不要彼此了解。我现在的架构是这样的,他们只知道应该写入/读取给定流中的数据。 – levanovd 2009-12-08 11:48:05
然后,可能会扩展Piped [In | Out] putStream来处理CountDownLatch的操作。 – Jerome 2009-12-08 11:53:04
或编写自己的包装管道和锁存器的Input/OutputStream(请参阅我在答案中添加的示例代码) – Jerome 2009-12-08 14:33:22