2013-04-17 78 views
0

我想了解管道流。 而不是管道流爲什麼我們不能使用其他流來互相管道?如下所示:無法理解管道輸入流

final ByteArrayOutputStream pos = new ByteArrayOutputStream(); 

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

什麼時候會在管道流中出現死鎖?我試圖使用單個主線程讀寫,但它執行順利。

+0

對此有任何答案? – user2286271

回答

0

這裏的難點在於該進程必須在多個線程中實現,因爲寫入管道的一端必須與另一端的讀取匹配。

創建一個線程來監視一個管道末端的到達並將它們推回另一個管道當然並不困難,但它不能用單個線程完成。

你看過this的問題嗎?

0

管道流允許高效使用最小努力的字節處理

我很可能是錯的,但我相信toByteArray()可能不會做你認爲它的做法。它只是複製當前的內容,而不是將來的任何內容。

所以這裏唯一真正的問題就是管理這個問題,這會有點困難。你必須不斷地輪詢輸出流。更不用說每次調用toByteArray(其中每個調用都使用"Creates a newly allocated byte array")的數組內存分配。

如何我懷疑死鎖可以在一個單獨的線程發生:

如果您嘗試(阻塞)從沒有數據尚未輸入流中讀取。它永遠無法獲取數據,因爲數據只能從必須寫入同一線程的輸出流中獲取,而這在您等待數據時不會發生。

所以,在單線程中,如果你不是很小心,會發生這種情況,但應該有可能在同一個線程中成功使用它們而沒有死鎖,但爲什麼要這麼做呢?我認爲另一個數據結構可能更適合,如鏈接列表或簡單的圓形數組。