ByteBuf
Java原生ByteBuffer
使用Buffer读写数据一般遵循以下四个步骤:
- 写入数据到Buffer(写)
- 调用
flip()方法(写->读) - 从Buffer中读取数据(读)
- 调用
clear()方法或者compact()方法(读->写)
属性
|
属性名 |
说明 |
| byte[] buff | 内部用于缓存的数组。 |
| position | 当前读取的位置。 |
| limit | 读写的上限,limit<=capacity。 |
|
capacity |
初始化时候的容量。 |
| mark | 为某一读过的位置做标记,便于某些时候回退到该位置。 |
读写模式图解
put
ByteBuffer创建后即为写模式,该模式下,往buffer里写一个字节,并把postion移动一位。写模式下,一般limit与capacity相等。
flip
写完数据,需要开始读的时候,将postion复位到0,并将limit设为当前postion。
get
从buffer里读一个字节,并把postion移动一位。上限是limit,即写入数据的最后位置。
相关方法
ByteBuffer无论读写,范围都是从position~limit,因此读写模式进行切换时需要修改position和limit的值。
|
方法 |
说明 |
|
put |
写 |
|
get |
读 |
|
flip |
写模式->读模式(limit=position;position=0) |
| rewind | 将position设为0,可以重读Buffer中的数据 |
|
clear |
读模式->写模式(忽略未读数据)。恢复到初始状态,接下来可进行写操作 |
|
compact |
读模式->写模式(不忽略未读数据)。将未读数据拷贝到Buffer起始处。将position设到最后一个未读元素正后面。 |
|
mark |
标记当前position |
|
reset |
重置position为标记位置 |
缺点
- 通过position和limit控制读写的范围不直观
- 读写模式切换需要调用对应方法,若不调用对应方法切换读写模式,会产生混乱
- 无法动态扩容
参考
- Java NIO系列教程(三) Buffer
- Java NIO 的前生今世 之三 NIO Buffer 详解
- Java NIO学习笔记之二-图解ByteBuffer
- ByteBuf:Netty的数据容器