架构师-Netty(五)

Buffer

ByteBuffer

常用的缓冲区JDK NIO 类库 java.nio.Buffer
在这里插入图片描述
JDK提供的ByteBuffer可以满足NIO编程,但有其局限性:

  • ByteBuffer 长度固定,不能自动扩缩容,编程对象POJO大于ByteBuffer的容量时,或发生索引越界异常
  • ByteBuffer只有一个标识位置的指针position,读写的时候需要手工调用flip()rewind()等,使用者必须必须小心谨慎地处理这些API,否则很容易导致程序处理失败;
  • ByteBuffer的API功能有限,一些高级和实用的特性不支持,需要使用者自己编程实现

ByteBuf自动扩容
iAbstractByteBuf#writeByte调用ensureWritable0方法

final void ensureWritable0(int minWritableBytes) {
   
       ensureAccessible();
       if (minWritableBytes <= writableBytes()) {
   
           return;
       }

       if (minWritableBytes > maxCapacity - writerIndex) {
   
           throw new IndexOutOfBoundsException(String.format(
                   "writerIndex(%d) + minWritableBytes(%d) exceeds maxCapacity(%d): %s",
                   writerIndex, minWritableBytes, maxCapacity, this));
       }

       // Normalize the current capacity to the power of 2.
       //  自动扩缩容
       int newCapacity = alloc().calculateNewCapacity(writerIndex + minWritableBytes, maxCapacity);
       // Adjust to the new capacity.
       capacity(newCapacity);
   }

ByteBuf的工作原理

ButeBuf依然是个Byte数组的缓冲区,基本功能应该与JDK的ByteBuffer一致:

  • 7种Java基本类型、byte数组、ByteBuffer(ByteBuf)等的读写
  • 缓冲区自身的copy和slice等
  • 设置网络字节序
  • 构造缓冲区实例
  • 操作位置指针等方法

Netty ByteBuf是根据ByteBuffer实现,现有两种策略:

  • 参考JDK ByteBuffer的实现,增加额外的功能,解决原ByteBuffer的缺点
  • 聚合JDK ByteBuffer,通过Facade模式对其进行包装,可以减少自身代码量,降低实现成本

ByteBuffer的读写

在这里插入图片描述

ByteBuffer不做flip操作,读取到将是positioncapacity之间的错误内容

   ByteBuffer buffer = ByteBuffer.allocate(88);
   String value = "Hello World";
   buffer.put(value.getBytes())
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值