Java 提供 ByteBuffer使用

Jdk原生的 ByteBuffer 還是比較難用的。

你可以認爲它是讀寫一體的。但是它讀的時候不可以寫,寫的時候不可以讀,因爲它記錄讀寫的位置只有一個 變量。

position 記錄寫或讀的 index。

limit     記錄可寫的最大位置或可讀的最大位置。

capacity 創建 ByteBuffer 的總容量。


ByteBuffer 屬性說明

寫的時候:

position 從0開始,每次一個字節 position++, position代表可寫的位置。
limit 等於 capacity,position可以達到的上限,position等於limit時不可以在寫。
capacity 最大的容量。

讀的時候:

position 從0開始,每次一個字節 position++, position代表可讀的位置。
limit limit值被賦值爲最後一個數據的位置,position等於limit時不可以在讀。
capacity 最大的容量。

ByteBuffer用法 

下面表格顯示position limit 在讀寫整理等變化

這種讀寫只能存在一種狀態,要麼讀,要麼寫,如果需要讀則需要轉爲讀,寫的話得轉爲寫。

1. 創建一個ByteBuffer (使用 數組的方式, jdk內存)

ByteBuffer bf = ByteBuffer.allocate(100); // 創建 容量爲 100

position 0
limit 100
capacity 100

2. putInt 寫4字節, 寫了兩次

bf.putInt(1000); // int 是 4字節

bf.putInt(3999); // int 是 4字節

// 此時剩餘可寫長度 limit - position = 92

position 8
limit 100
capacity 100

3. put 寫 1 字節 寫了1次

bf.put((byte)1); // 此時剩餘可寫長度 limit - position = 91

position 9
limit 100
capacity 100

4. flip 轉化爲讀

bf.flip(); // 轉化爲讀狀態後,可讀長度就是 limit-position = 9

flip() {
    limit = position;
    position = 0;
    mark = -1;
}

 

position 0
limit 9
capacity 100

5. getInt() 讀 4字節

int val = bf.getInt(); // val = 1000, 此時可讀長度 limit-position = 5

position 4
limit 9
capacity 100

6. compact() 整理並切換爲寫。移除已讀部分。

bf.compact(); // 此時可寫長度 limit - position = 95

position 5
limit 100
capacity 100

7 clear() 清理, 可以寫。

clear() {
    position = 0;
    limit = capacity;
    mark = -1;
}
position 0
limit 100
capacity 100

 

 

 

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