Position
您可以回想一下,緩沖區實際上就是美化了的數組。在從通道讀取時,您將所讀取的數據放到底層的數組中。 position
變量跟蹤已經寫了多少數據。更准確地說,它指定了下一個字節將放到數組的哪一個元素中。因此,如果您從通道中讀三個字節到緩沖區中,那么緩沖區的 position
將會設置為3,指向數組中第四個元素。
同樣,在寫入通道時,您是從緩沖區中獲取數據。 position
值跟蹤從緩沖區中獲取了多少數據。更准確地說,它指定下一個字節來自數組的哪一個元素。因此如果從緩沖區寫了5個字節到通道中,那么緩沖區的 position
將被設置為5,指向數組的第六個元素。
Limit
limit
變量表明還有多少數據需要取出(在從緩沖區寫入通道時),或者還有多少空間可以放入數據(在從通道讀入緩沖區時)。
position
總是小於或者等於 limit
。
Capacity
緩沖區的 capacity
表明可以儲存在緩沖區中的最大數據容量。實際上,它指定了底層數組的大小 ― 或者至少是指定了准許我們使用的底層數組的容量。
limit
決不能大於 capacity
。
觀察變量
我們首先觀察一個新創建的緩沖區。出於本例子的需要,我們假設這個緩沖區的 總容量
為8個字節。 Buffer
的狀態如下所示:
回想一下 ,limit
決不能大於 capacity
,此例中這兩個值都被設置為 8。我們通過將它們指向數組的尾部之后(如果有第8個槽,則是第8個槽所在的位置)來說明這點。
position
設置為0。如果我們讀一些數據到緩沖區中,那么下一個讀取的數據就進入 slot 0 。如果我們從緩沖區寫一些數據,從緩沖區讀取的下一個字節就來自 slot 0 。 position
設置如下所示:
由於 capacity
不會改變,所以我們在下面的討論中可以忽略它。
第一次讀取
現在我們可以開始在新創建的緩沖區上進行讀/寫操作。首先從輸入通道中讀一些數據到緩沖區中。第一次讀取得到三個字節。它們被放到數組中從 position
開始的位置,這時 position 被設置為 0。讀完之后,position 就增加到 3,如下所示:
limit
沒有改變。
第二次讀取
在第二次讀取時,我們從輸入通道讀取另外兩個字節到緩沖區中。這兩個字節儲存在由 position
所指定的位置上, position
因而增加 2:
limit
沒有改變。
flip
現在我們要將數據寫到輸出通道中。在這之前,我們必須調用 flip()
方法。這個方法做兩件非常重要的事:
- 它將
limit
設置為當前position
。 - 它將
position
設置為 0。
前一小節中的圖顯示了在 flip 之前緩沖區的情況。下面是在 flip 之后的緩沖區:
我們現在可以將數據從緩沖區寫入通道了。 position
被設置為 0,這意味着我們得到的下一個字節是第一個字節。 limit
已被設置為原來的 position
,這意味着它包括以前讀到的所有字節,並且一個字節也不多。
第一次寫入
在第一次寫入時,我們從緩沖區中取四個字節並將它們寫入輸出通道。這使得 position
增加到 4,而 limit
不變,如下所示:
第二次寫入
我們只剩下一個字節可寫了。 limit
在我們調用 flip()
時被設置為 5,並且 position
不能超過 limit
。所以最后一次寫入操作從緩沖區取出一個字節並將它寫入輸出通道。這使得 position
增加到 5,並保持 limit
不變,如下所示:
clear
最后一步是調用緩沖區的 clear()
方法。這個方法重設緩沖區以便接收更多的字節。 Clear
做兩種非常重要的事情:
- 它將
limit
設置為與capacity
相同。 - 它設置
position
為 0。
下圖顯示了在調用 clear()
后緩沖區的狀態:
緩沖區現在可以接收新的數據了。
原文:https://www.ibm.com/developerworks/cn/education/java/j-nio/j-nio.html#