NIO相關概念之Buffer

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的位置來實現的:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章