java中byte的用法_netty原理[通俗易懂]

java中byte的用法_netty原理[通俗易懂]a_bytebuffer

文章目录

  • 1.ByteBuffer的2种创建方式
  • 2.字符串转成ByteBuffer的3三种方式
  • 3.Bytebuffer的读写底层原理
  • 参考

ByteBuffer是字节缓冲区,主要用户读取和缓存字节数据,多用于网络编程,原生的类,存在不好用,Netty采用自己的ByteBuff,对其进行了改进

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()切换为读模式

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的容量

核心思想:Bytebuffer的读写共用position、limit参数,因此需要切换至读模式(调用flip())和写模式(调用)

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

二.写模式下,写数据时,Position会不断前移

在这里插入图片描述

三.调用flip()切换为读模式,此时Postion置为已有数据的起始下标,limit置为已有数据的末尾下标
在这里插入图片描述

四.调用clear()方法切换为写模式,采用清空缓冲区,将potision置为0,limit置为capacity

在这里插入图片描述
至此,我们知道读写模式由于共用相同的position等参数,因此,需要切换模式,才能正确的读写。

并且在发生一次写读(先写后读)切换后,需要调用clear()方法进行重置,才能进行一轮新的写读

当然,你可以连续写或连续读,读读或写写可以连续执行,不需要额外操作。例如:

ByteBuffer buf = ByteBuffer.allocate(int size);
   buf.put(msg.getBytes());  //ok
   buf.put(msg2.getBytes());  //ok

存在的问题:

  • 读操作后,重新写,调用clear()会重置至0的问题,如果没有读完呢?

    例如 存在接收到的数据是不完整的,无法进行读操作,那么需要在原来的基础上,继续写数据怎么办?

答案是 Buffer.compact() 切换到写入模式

五. 调用compact方法切换为写模式,在不清空缓冲区的前提下,继续写如信息,将未读取的数据前移,postion指针置为未读取数据的末尾下标,limit置为capacity

在这里插入图片描述
上图左侧灰色是已读部分数据,绿色是未读部分,在此基础上,调用compact继续写,会进行部分清楚操作,同时保留未读部分,这也是推荐的用法

参考

ByteBuffer的原理和使用详解
Java ByteBuffer:如何使用 flip() 和 compact()

今天的文章java中byte的用法_netty原理[通俗易懂]分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/58122.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注