1. 程式人生 > >NIO相關概念之Buffer

NIO相關概念之Buffer

code 讀取 fin 進制 最大 分享 AS 容量 CI

Buffer的定義:

概念上,緩沖區是包在一個對象內的基本數據元素數組。Buffer類相比一個簡單數組的優點是它將關於數據的數據內容和信息包含在一個單一的對象中。Buffer類以及它專有的子類定義了一個用於處理數據緩沖區的API。

Buffer類的有以下的幾個最關鍵的屬性

容量(Capacity) 緩沖區能夠容納的數據元素的最大數量。這一容量在緩沖區創建時被設定,並且永遠不能被改變。

上界(Limit) 緩沖區的第一個不能被讀或寫的元素。或者說,緩沖區中現存元素的計數。

位置(Position) 下一個要被讀或寫的元素的索引。位置會自動由相應的get( )和put( )函數更新。

標記(Mark) 一個備忘位置。調用mark( )來設定mark = postion。調用reset( )設定position = mark。標記在設定前是未定義的(undefined)。

這四個屬性之間總是遵循以下關系: mark <= position <= limit <= capacity

以下是Buffer類的源代碼:
技術分享圖片

新創建的緩沖區: 此時,mark和position都為0 ,limit和capacity都為緩沖區的長度,我們可以往緩沖區裏邊寫入數據

技術分享圖片

將緩沖區內寫入一些數據:此時,只有position的位置變了,它指向我們下一個可寫的元素位置

技術分享圖片

既然我們已經在buffer中存放了一些數據,如果我們想在不丟失位置的情況下進行一些更改該怎麽辦呢?put()的絕對方案可以達到這樣的目的。假設我們想將緩沖區中的內容從“Hello”的ASCII碼更改為“Mellow”。我們可以這樣實現:

buffer.put(0,(byte)'M').put((byte)'w'); 

這裏通過進行一次絕對方案的put將0位置的字節代替為十六進制數值0x4d,將0x77放入當前位置(當前位置不會受到絕對put()的影響)的字節,並將位置屬性加一。結果下所示:

技術分享圖片

將緩沖區翻轉:

緩沖區的讀取和寫入都是從postion開始的,直到limit結束.當我們把緩沖區寫了一些數據之後,想讀取這些數據,我們可以調整limit和position的位置,讓limit指向原先的position,讓position指向0 ,這樣就可以讀到原先寫書的數據了,JDK為我們提供了一個簡單的方法:

    buffer.flip();

翻轉之後的緩沖區:

技術分享圖片

flip()方法的內部也是通過改寫limit和position的位置來實現的:

技術分享圖片

NIO相關概念之Buffer