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