ByteBuffer的原理和使用详解

本文详细介绍了ByteBuffer的两种创建方式:堆内与堆外内存,分析了各自的优缺点。同时,讲解了字符串转换为ByteBuffer的三种方法,并探讨了ByteBuffer的读写操作及底层原理,包括position、limit和capacity的角色。通过理解这些,可以更高效地使用ByteBuffer进行数据读写。


ByteBuffer是字节缓冲区,主要用户读取和缓存字节数据,多用于网络编程,Netty框架的重要知识点

1.ByteBuffer的2种创建方式

1.ByteBuffer buf = ByteBuffer.allocate(int size);
方式1的buf缓冲区存储在堆内存中,内存开销在JVM中,受GC影响,会多拷贝一次,因为java程序收到的数据首先被系统内存所获取,然后再拷贝给JVM
2.ByteBuffer buf = ByteBuffer.allocateDirect(int size);
方式2的buf在系统直接内存中创建,内存开销在JVM之外,读写效率高(不受GC影响,0拷贝),但是分配效率低,使用后若不释放,会造成内存泄漏

下图是不同容量情况下,两种ByteBuffer的读写效率,根据需求选择创建方式
在这里插入图片描述

2.字符串转成ByteBuffer的3三种方式

方式1: 采用put()方法,读数据时需要调用flip()切换为读模式

1.ByteBuffer buf = ByteBuffer.allocate(int size);
   buf.put(msg.getBytes());

方式2:以特定编码格式将String转换为ByteBuffer

ByteBuffer buffer1 = StandardCharsets.UTF_8.encode("hello");

方式3:调用ByteBuffer.wrap()

ByteBuffer buf = ByteBuffer.wrap(msg.getBytes());

3.Bytebuffer的读写底层原理

Bytebuffer的数据读写主要采用三个参数来控制
1.position:起始下标
2.limit:限制下标
3.capacity:buffer的容量

一.开始时,position指向0,limit指向capacity
在这里插入图片描述

二.写模式下,写数据时,Position会不断前移
在这里插入图片描述
三.调用flip()切换为读模式,此时Postion置为已有数据的起始下标,limit置为已有数据的末尾下标
在这里插入图片描述
四.调用clear()方法切换为写模式,采用清空缓冲区,将potision置为0,limit置为capacity
在这里插入图片描述
五.调用compact方法切换为写模式,在不清空缓冲区的前提下,继续写如信息,将未读取的数据前移,postion指针置为未读取数据的末尾下标,limit置为capacity
在这里插入图片描述

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值