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