ByteBuf

本文深入探讨Java NIO中的Buffer机制,详细讲解了ByteBuffer的工作原理,包括写入、翻转、读取和重置模式,以及如何通过position、limit和capacity属性控制数据的读写流程。同时对比了ByteBuf在Netty中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ByteBuf

Java原生ByteBuffer

使用Buffer读写数据一般遵循以下四个步骤:

  1. 写入数据到Buffer(写)
  2. 调用flip()方法(写->读)
  3. 从Buffer中读取数据(读)
  4. 调用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为标记位置

缺点

  1. 通过position和limit控制读写的范围不直观
  2. 读写模式切换需要调用对应方法,若不调用对应方法切换读写模式,会产生混乱
  3. 无法动态扩容

 

参考

  1. Java NIO系列教程(三) Buffer
  2. Java NIO 的前生今世 之三 NIO Buffer 详解
  3. Java NIO学习笔记之二-图解ByteBuffer
  4. ByteBuf:Netty的数据容器
### Netty 中 ByteBuf 的用法及常见问题解析 #### 1. ByteBuf 的基本概念 ByteBuf 是 Netty 提供的一种高效缓冲区管理工具,用于替代 JDK 自带的 ByteBuffer。它具有更灵活的功能设计和更高的性能表现[^1]。 #### 2. 创建 ByteBuf 实例 以下是创建 ByteBuf 的简单示例代码: ```java public class NettyByteBufExample { public static void main(String[] args) { // 默认分配器创建 ByteBuf 对象 ByteBuf buf = ByteBufAllocator.DEFAULT.buffer(); System.out.println(buf); } } ``` 上述代码展示了如何通过 `ByteBufAllocator` 来获取默认的 ByteBuf 实例[^2]。 #### 3. ByteBuf 的存储结构 ByteBuf 的内部存储结构分为三个主要部分:读索引 (`readerIndex`)、写索引 (`writerIndex`) 和容量 (`capacity`)。这些字段共同决定了数据的操作范围和边界。 #### 4. 控制池化功能 Netty 支持通过环境变量配置是否启用内存池机制。如果希望禁用内存池,则可以通过设置如下参数实现: ```properties -Dio.netty.allocator.type=unpooled ``` 反之,若要启用内存池,则将值设为 `pooled` 即可。 #### 5. 高度可扩展性 ByteBuf 接口允许开发者根据实际需求对其进行扩展或自定义实现。例如,在某些特殊场景下可能需要增加额外的方法或属性支持,此时可通过继承现有类或者重新实现接口完成定制开发工作[^4]。 #### 6. 内存泄漏检测 为了防止因不当操作而导致资源未释放而引发的潜在风险,Netty 设计了一套完善的内存泄露监控体系。当发现异常情况时会自动记录相关信息以便排查问题所在位置[^3]。 --- ### 示例代码展示 以下是一个简单的 ByteBuf 使用案例: ```java import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; public class SimpleByteBufUsage { public static void main(String[] args) { // 创建一个非池化的 ByteBuf ByteBuf buffer = Unpooled.buffer(10); // 向 Buffer 写入字节数据 String message = "Hello"; byte[] bytes = message.getBytes(); buffer.writeBytes(bytes); // 输出当前状态信息 System.out.println("Reader Index: " + buffer.readerIndex()); System.out.println("Writer Index: " + buffer.writerIndex()); // 移动 Reader Index 并读取第一个字符 char firstChar = (char) buffer.readByte(); System.out.println("First Character: " + firstChar); // 清理资源 buffer.release(); } } ``` 此程序演示了如何向 ByteBuf 写入字符串并从中提取单个字符的过程。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值