1. 程式人生 > >Java IO學習--(三)通道

Java IO學習--(三)通道

write 傳遞 完整 conn input idt bsp unix 取出

Java IO中的管道為運行在同一個JVM中的兩個線程提供了通信的能力。所以管道也可以作為數據源以及目標媒介。

你不能利用管道與不同的JVM中的線程通信(不同的進程)。在概念上,Java的管道不同於Unix/Linux系統中的管道。在Unix/Linux中,運行在不同地址空間的兩個進程可以通過管道通信。在Java中,通信的雙方應該是運行在同一進程中的不同線程。

通過Java IO創建管道

可以通過Java IO中的PipedOutputStream和PipedInputStream創建管道。一個PipedInputStream流應該和一個PipedOutputStream流相關聯。一個線程通過PipedOutputStream寫入的數據可以被另一個線程通過相關聯的PipedInputStream讀取出來。

Java IO管道示例

這是一個如何將PipedInputStream和PipedOutputStream關聯起來的簡單例子:

技術分享圖片

註:本例忽略了流的關閉。請在處理流的過程中,務必保證關閉流,或者使用jdk7引入的try-resources代替顯示地調用close方法的方式。

你也可以使用兩個管道共有的connect()方法使之相關聯。PipedInputStream和PipedOutputStream都擁有一個可以互相關聯的connect()方法。

管道和線程

請記得,當使用兩個相關聯的管道流時,務必將它們分配給不同的線程。read()方法和write()方法調用時會導致流阻塞,這意味著如果你嘗試在一個線程中同時進行讀和寫,可能會導致線程死鎖。

管道的替代

除了管道之外,一個JVM中不同線程之間還有許多通信的方式。實際上,線程在大多數情況下會傳遞完整的對象信息而非原始的字節數據。但是,如果你需要在線程之間傳遞字節數據,Java IO的管道是一個不錯的選擇。

Java IO學習--(三)通道