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

 

 

 

上一篇:2021-07-15


下一篇:字符串模式匹配——病毒检测