ByteBuf接口方法说明
一、基础属性和容量管理
1.1 容量相关
capacity(): 返回当前ByteBuf的容量capacity(int newCapacity): 调整ByteBuf的容量maxCapacity(): 返回ByteBuf允许的最大容量maxWritableBytes(): 返回最大可写字节数,等于maxCapacity() - writerIndex
1.2 内存类型
isDirect(): 是否是直接内存缓冲区isReadOnly(): 是否是只读缓冲区asReadOnly(): 将当前缓冲区转换为只读缓冲区
二、读写指针管理
2.1 读指针操作
readerIndex(): 获取当前读指针位置readerIndex(int readerIndex): 设置读指针位置markReaderIndex(): 标记当前读指针位置resetReaderIndex(): 将读指针重置到上次标记的位置
2.2 写指针操作
writerIndex(): 获取当前写指针位置writerIndex(int writerIndex): 设置写指针位置markWriterIndex(): 标记当前写指针位置resetWriterIndex(): 将写指针重置到上次标记的位置
2.3 读写状态
isReadable(): 是否可读isReadable(int size): 是否可读指定字节数readableBytes(): 可读字节数isWritable(): 是否可写isWritable(int size): 是否可写指定字节数writableBytes(): 可写字节数
2.4 指针重置
clear(): 清空读写指针(设置为0)但不清除内容setIndex(int readerIndex, int writerIndex): 同时设置读写指针
三、内存管理
3.1 内存分配
alloc(): 返回创建此缓冲区的ByteBufAllocatorunwrap(): 返回被包装的ByteBuf对象
3.2 引用计数
refCnt(): 获取引用计数retain(): 增加引用计数retain(int increment): 增加指定数量的引用计数release(): 减少引用计数release(int decrement): 减少指定数量的引用计数
四、数据操作
4.1 基本读写操作
不修改读写指针
getByte(int index): 读取指定位置的字节getBytes(int index, byte[] dst): 读取字节到目标数组setByte(int index, int value): 设置指定位置的字节setBytes(int index, byte[] src): 从源数组写入字节
4.2 高级读写操作
readByte(): 读取一个字节并移动读指针readBytes(byte[] dst): 读取字节到目标数组并移动读指针writeByte(int value): 写入一个字节并移动写指针writeBytes(byte[] src): 写入源数组的字节并移动写指针
4.3 搜索操作
indexOf(int fromIndex, int toIndex, byte value): 查找指定字节的位置bytesBefore(byte value): 查找指定字节之前的字节数forEachByte(ByteProcessor processor): 遍历所有字节进行处理
4.4 字节序
order(): 获取字节序order(ByteOrder endianness): 设置字节序
五、特殊操作
5.1 复制和切片
copy(): 创建当前缓冲区的完整副本slice(): 创建当前缓冲区可读部分的切片,修改会影响原缓冲区。retainedSlice(): 创建当前缓冲区可读部分的切片,并增加引用计数
5.2 数据丢弃和压缩
discardReadBytes(): 丢弃已读字节并回收空间discardSomeReadBytes(): 丢弃部分已读字节
5.3 I/O操作
readBytes(OutputStream out, int length): 读取字节到输出流writeBytes(InputStream in, int length): 从输入流写入字节getBytes(int index, GatheringByteChannel out, int length): 将字节写入到GatheringByteChannelsetBytes(int index, ScatteringByteChannel in, int length): 从ScatteringByteChannel读取字节
其他操作:
nioBuffer() - 将Netty的ByteBuf转换为Java NIO的ByteBuffer。这个转换可能是共享底层数据(零拷贝),也可能是完全拷贝数据,具体取决于ByteBuf的实现类型。
hasArray()/array()方法:用于判断ByteBuf是否由堆内存的字节数组支持,如果是则可以通过array()方法直接访问底层的字节数组,这种方式效率最高。但只适用于堆内存的ByteBuf,对于直接内存的ByteBuf会抛出异常。
forEachByte(ByteProcessor) 高级遍历接口,支持自定义字节处理逻辑。
ByteBuf和ByteBuffer的主要区别:
ByteBuf提供了读写指针分离的设计,而ByteBuffer只有一个position指针
ByteBuf支持引用计数进行内存管理,而ByteBuffer需要手动管理
ByteBuf提供了更丰富的API和链式调用,使用更方便
ByteBuf具有池化功能,可以重用缓冲区,性能更好
使用建议
优先使用链式调用:如 buf.writeInt(1).markReaderIndex().resetReaderIndex()
避免频繁 discardReadBytes:可能引发内存复制影响性能。
结合 ByteBufAllocator:使用池化分配器提升内存利用率。
