java nio 緩沖區讀寫數據(圖形詳解)


Position

您可以回想一下,緩沖區實際上就是美化了的數組。在從通道讀取時,您將所讀取的數據放到底層的數組中。 position 變量跟蹤已經寫了多少數據。更准確地說,它指定了下一個字節將放到數組的哪一個元素中。因此,如果您從通道中讀三個字節到緩沖區中,那么緩沖區的 position 將會設置為3,指向數組中第四個元素。

同樣,在寫入通道時,您是從緩沖區中獲取數據。 position 值跟蹤從緩沖區中獲取了多少數據。更准確地說,它指定下一個字節來自數組的哪一個元素。因此如果從緩沖區寫了5個字節到通道中,那么緩沖區的 position 將被設置為5,指向數組的第六個元素。

Limit

limit 變量表明還有多少數據需要取出(在從緩沖區寫入通道時),或者還有多少空間可以放入數據(在從通道讀入緩沖區時)。

position 總是小於或者等於 limit

Capacity

緩沖區的 capacity 表明可以儲存在緩沖區中的最大數據容量。實際上,它指定了底層數組的大小 ― 或者至少是指定了准許我們使用的底層數組的容量。

limit 決不能大於 capacity

觀察變量

我們首先觀察一個新創建的緩沖區。出於本例子的需要,我們假設這個緩沖區的 總容量 為8個字節。 Buffer 的狀態如下所示:

Buffer state

回想一下 ,limit 決不能大於 capacity,此例中這兩個值都被設置為 8。我們通過將它們指向數組的尾部之后(如果有第8個槽,則是第8個槽所在的位置)來說明這點。

Array

position 設置為0。如果我們讀一些數據到緩沖區中,那么下一個讀取的數據就進入 slot 0 。如果我們從緩沖區寫一些數據,從緩沖區讀取的下一個字節就來自 slot 0 。 position 設置如下所示:

Position setting

由於 capacity 不會改變,所以我們在下面的討論中可以忽略它。

第一次讀取

現在我們可以開始在新創建的緩沖區上進行讀/寫操作。首先從輸入通道中讀一些數據到緩沖區中。第一次讀取得到三個字節。它們被放到數組中從 position 開始的位置,這時 position 被設置為 0。讀完之后,position 就增加到 3,如下所示:

Position increased to 3

limit 沒有改變。

第二次讀取

在第二次讀取時,我們從輸入通道讀取另外兩個字節到緩沖區中。這兩個字節儲存在由 position 所指定的位置上, position 因而增加 2:

Position increased by 2

limit 沒有改變。

flip

現在我們要將數據寫到輸出通道中。在這之前,我們必須調用 flip() 方法。這個方法做兩件非常重要的事:

  1. 它將 limit 設置為當前 position
  2. 它將 position 設置為 0。

前一小節中的圖顯示了在 flip 之前緩沖區的情況。下面是在 flip 之后的緩沖區:

Buffer after the flip

我們現在可以將數據從緩沖區寫入通道了。 position 被設置為 0,這意味着我們得到的下一個字節是第一個字節。 limit 已被設置為原來的 position,這意味着它包括以前讀到的所有字節,並且一個字節也不多。

第一次寫入

在第一次寫入時,我們從緩沖區中取四個字節並將它們寫入輸出通道。這使得 position 增加到 4,而 limit 不變,如下所示:

Position advanced to 4, limit unchanged

第二次寫入

我們只剩下一個字節可寫了。 limit在我們調用 flip() 時被設置為 5,並且 position 不能超過 limit。所以最后一次寫入操作從緩沖區取出一個字節並將它寫入輸出通道。這使得 position 增加到 5,並保持 limit 不變,如下所示:

Position advanced to 5, limit unchanged

clear

最后一步是調用緩沖區的 clear() 方法。這個方法重設緩沖區以便接收更多的字節。 Clear 做兩種非常重要的事情:

  1. 它將 limit 設置為與 capacity 相同。
  2. 它設置 position 為 0。

下圖顯示了在調用 clear() 后緩沖區的狀態:

State of the buffer after clear() has been called

緩沖區現在可以接收新的數據了。

 

原文:https://www.ibm.com/developerworks/cn/education/java/j-nio/j-nio.html#


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM