我有兩個線程。其中一個寫入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