博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ByteBuf
阅读量:7155 次
发布时间:2019-06-29

本文共 1297 字,大约阅读时间需要 4 分钟。

ByteBuf有两个索引,readerIndex和writerIndex,起始位置都是0。当readerIndex大于writerIndex时则会触发IndexOutOfBoundsException

以read或write开头的方法,会移动索引,而以set或get开头的方法则不会。

可以指定ByteBuf的最大容量,但是不能超过Integer.MAX_VALUE ####派生缓冲区 生成方式:

  • duplicate();
  • slice();
  • slice(int,int);
  • Unpooled.unmodifiableBuffer(...);
  • order(ByteOrder);
  • readSlice(int); slice和copy的区别:slice方法获取的切片与源ByteBuf共享数据,copy方法获取的ByteBuf为副本,不与源ByteBuf共享数据。

####ByteBuf 使用模式

  • 堆缓冲区
ByteBuf heapBuf = ...;if (heapBuf.hasArray()) { // 检查ByteBuf 是否有一个支撑数组 byte[] array = heapBuf.array(); // 如果有,则获取对该数组的引用  int offset = heapBuf.arrayOffset() + heapBuf.readerIndex(); // 计算第一个字节的偏移量。则获取对该数组的引用  int offset = heapBuf.arrayOffset() + heapBuf.readerIndex(); // 计算第一个字节的偏移量。}复制代码
  • 直接缓冲区
ByteBuf directBuf = ...; if (!directBuf.hasArray()) { ← -- 检查ByteBuf 是否由数组支撑。如果不是,则这是一个直接缓冲区int length = directBuf.readableBytes(); ← -- 获取可读字节数 byte[] array = new byte[length]; ← -- 分配一个新的数组来保存具有该长度的字节数据directBuf.getBytes(directBuf.readerIndex(), array); ← -- 将字节复制到该数组 handleArray(array, 0, length); ← -- 使用数组、偏移}复制代码
  • 复合缓冲区

####ByteBuf分配

按需分配:ByteBufAllocator接口

Channel channel = ...;ByteBufAllocator allocator = channel.alloc(); ← -- 从Channel 获取一个到ByteBufAllocator 的引用ChannelHandlerContext ctx = ...;ByteBufAllocator allocator2 = ctx.alloc(); ← -- 从ChannelHandlerContext 获取一个到By复制代码

Unpooled缓冲区

转载地址:http://qqegl.baihongyu.com/

你可能感兴趣的文章
Scrum中,拆分故事的INVEST原则
查看>>
mybatis-dynamic sql
查看>>
runtime 动态增加属性
查看>>
select实现精确定时器
查看>>
Centos下安装类百度文库环境
查看>>
JS监听对象属性读写的5种方法
查看>>
多个wifi路由器组建一个wifi网络增加网络覆盖范围
查看>>
作为“创业导师”的天使投资人
查看>>
改变世界梦想的创业者
查看>>
国产数据库一览表
查看>>
获取url的参数包括中文参数
查看>>
ios 中使用 block
查看>>
详解Google Authenticator工作原理
查看>>
树莓派设置屏幕待机时间
查看>>
mysql问题汇总
查看>>
php/Java Web国际化的联合解决方案
查看>>
AndroidStudio环境的搭建
查看>>
Postgresql数据类型
查看>>
django-ckeditor 使用
查看>>
布隆过滤器
查看>>