ByteBuffer

1.创建方式

创建方式1:ByteBuffer buf = ByteBuffer.allocate(int size);

  public static ByteBuffer getTimeBuffer(Tablet tablet) {
    ByteBuffer timeBuffer = ByteBuffer.allocate(tablet.getTimeBytesSize());
    for (int i = 0; i < tablet.rowSize; i++) {
      timeBuffer.putLong(tablet.timestamps[i]);
    }
    timeBuffer.flip();
    return timeBuffer;
  }
  • buf缓冲区存储在堆内存中,内存开销在JVM中,受GC影响,会多拷贝一次,因为java程序收到的数据首先被系统内存所获取,然后再拷贝给JVM

2.创建方式2:ByteBuffer buf = ByteBuffer.allocateDirect(int size);

  • buf在系统直接内存中创建,内存开销在JVM之外,读写效率高(不受GC影响,0拷贝),但是分配效率低,使用后若不释放,会造成内存泄漏

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的数据读写主要采用三个参数来控制

  • 1.position:起始下标

  • 2.limit:限制下标

  • 3.capacity:buffer的容量
    在这里插入图片描述
    一开始limit指向capacity,position指向0
    在这里插入图片描述
    在这里插入图片描述

写模式下,写数据时,position会不断前移

在这里插入图片描述
在这里插入图片描述

timeBuffer.flip();切换为读模式,limit位于position位置,position位置置于起始位置

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aps5cc0u-1690883091607)(file:///Users/rongli/Library/Application%20Support/marktext/images/2023-08-01-17-36-56-image.png?msec=1690882616983)]

timeBuffer.clear();切换为写模式,采用清空缓冲区,将position置为0,limit为capacity

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ivWPsOsi-1690883091607)(file:///Users/rongli/Library/Application%20Support/marktext/images/2023-08-01-17-36-42-image.png?msec=1690882602657)]

划重点:由此可见,读写模式由于共用相同的position等参数,因此,需要切换模式,才能正确的读写。

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

存在的问题:

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

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

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

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YIjrg6tP-1690883091607)(file:///Users/rongli/Library/Application%20Support/marktext/images/2023-08-01-17-44-34-image.png?msec=1690883074749)]
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值