2025-02-09

Java NIO 入門(二)Channels and buffers(通道和緩沖)
guibin.beijing@gmail.com

概述
Channel和Buffer是NIO中最核心的對象,他們用在幾乎每一個NIO的操作上。

Channel模擬瞭老IO包中的流的概念。所有去任何地方(或者來自任何地方)的數據都必須通過Channel對象。Buffer本質上說是一個容器對象。任何發送到Channel的數據都必須先放進Buffer,類似的,任何從Channel中讀出的數據都先讀進Buffer。

在本節中你將學會在NIO中使用Channel和Buffer。

什麼是Buffer?
Buffer就是一個裝載數據的容器對象,數據從Buffer中讀出,或者把數據寫入Buffer中。在NIO中添加瞭Buffer對象,這是NIO和老IO最重要的區別。在面向流的I/O中,你可以把數據直接寫入Stream對象,或者直接把數據從Stream中讀出來,而不需要任何容器。

Buffer本質上就是一個數組(array)。通常它是一個字節數組,或者其他種類的可用數組。但是Buffer除瞭是一個數組之外,它還提供瞭結構化的訪問數據的方法,並且還用來跟蹤系統的讀/寫過程。

Buffer的種類
最通常使用的Buffer是ByteBuffer。ByteBuffer允許get/set(也就是讀取/寫入字節)操作底層的字節數組。

ByteBuffer不是NIO中唯一的buffer,實際上對每種JAVA原生類型都對應一個相應的Buffer。
ByteBuffer
CharBuffer
ShortBuffer
IntBuffer
LongBuffer
FloatBuffer
DoubleBuffer

每種類型的Buffer類都是Buffer接口的一個實例。除瞭ByteBuffer之外,每個Buffer都有完全一樣的操作,區別僅僅在於他們操作的數據類型。因為ByteBuffer用於絕大多數標準的I/O操作,它除瞭具有其他類型Buffer共有的操作之外,還有一些個性的操作。

什麼是Channel?
Channel是這樣一個對象:你可以從Channel中讀取數據,並且你也可以從Channel中寫入數據。NIO與老的IO相比而言,Channel就如同Stream。

就像之前提到的,所有被NIO處理的數據都必須通過Buffer對象,而不能直接將任何字節寫入Channel;而是必須先將數據寫入Buffer。Buffer中可以包含少到一個字節,多到任何字節數目。相似的,也不能直接從Channel中讀取任何字節,必須首先通過Channel將數據讀入Buffer,然後再從Buffer中獲取數據。

Channel的種類
Channel與Stream的區別在於:Channel是雙向的,而Stream隻能是單向的(Stream必須是InputStream或者OutpugStream的一個子類,即要麼是輸入流,要麼是輸出流,不能即輸入又輸出),而Channel再被打開之後,即可以讀,也可以寫,或者同時進行讀寫操作。

因為Channel是雙向的,因此它比Stream更好的反應瞭底層操作系統IO的實質。特別是在Linux系統中,底層操作系統都是雙向的。

作者“guibin”
 

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *