【闪电侠学netty】第7章 数据载体ByteBuf的介绍

【Netty】读书笔记 - 跟闪电侠学netty

1. 内容概要

1.1 总结

1.1.1 内存管理

        Netty 使用的是堆外内存,需要手动释放,使用引用计数的方式管理内存,当引用计数 =0,回收ByteBuf 底层内存

        原则:谁使用retain() , 谁释放release()

1.1.2  创建ByteBuf的方式

  • ByteBuf buffer = ctx.alloc().buffer(); (第6章,P41
  • ByteBuf buffer = ByteBufAllocator.DEFAULT.buffer(9, 100);(第7章,P49
  • ByteBuf buffer = ByteBufAllocator.DEFAULT.ioBuffer();(第8章,P59
  • ByteBuf buffer = ctx.alloc().ioBuffer();(第9章 csdn

其中 

ctx 为 ChannelHandlerContext 通道处理上下文对象

ctx.alloc() 返回 ByteBufAllocator ByteBuf的分配器

2. 课程内容

1 ByteBuf 的结构

  • ByteBuf 容器 - 当前容量 capacity  =  已废弃的字节 + 可读字节 + 可写字节
  • ByteBuf 容器 - 最大容量 maxCapacity   capacity  + 可扩容字节
  • 被读写指针划分三部分
  • 从指针开始的地方读写,读写之间相互没有冲突
  • 已废弃的字节(通常为0)

1.1 readerIndex

  • 读指针,从0开始
  • ByteBuf 中每读一个字节,readerIndex自增1
  • 可读字节数 = writerIndex - readerIndex , 所以writeIndex = readerIndex,ByteBuf 不可读

1.2 writerIndex

  • 写指针,从0开始
  • ByteBuf中每写一个字节,writerIndex自增1,直到 capacity
  • 可写字节数 = capacity writeIndex

1.3 扩容

  • ByteBuf 写数据,容量不足就会自动扩容
  • capacity 扩容到 maxCapacity
  • 超过maxCapacity会报错


2 常用 API

API类别名称使用
容量capacity()当前ByteBuf容量 capacity =  已废弃的字节 + 可读字节 + 可写字节
maxCapacity()最大容量=  capacity 可扩容字节
readableBytes()ByteBuf当前可读字节数,= writerIndex - readerIndex
isReadable()是否可读
writableBytes()ByteBuf当前可写字节数,= capacity writeIndex
isWritable()是否可写
MaxWritableBytes()最大可写字节数,= maxCapacity writeIndex
读写指针readerIndex()返回当前读指针readerIndex
readerIndex(int)设置读指针index
writerIndex()返回当前写指针writerIndex
writerIndex(int)设置写指针index
markReaderIndex()保存当前读指针(推荐)
resetReaderIndex()把当前读指针恢复到之前保存的值(推荐)
markWriterIndex()保存当前写指针(推荐)
resetWriterIndex()把当前写指针恢复到之前保存的值(推荐)
读写readBytes(byte[] dst)把ByteBuf中的数据全部读取到dst
writeBytes(byte[] src)将src中的数据写入到ByteBuf
readByte()从ByteBuf中读取一个字节
writeByte(byte b)往ByteBuf写入一个字节
retain()引用计数加1
release()引用计数减1
slice()截取readerIndex到writeIndex的数据,返回最大容量为原始ByteBuf的readableBytes()的ByteBuf
duplicate()共享原始ByteBuf,书本确实示例,后期补全
copy()复制原始ByteBuf,返回的ByteBuf写数据不影响原始ByteBuf
retainedSlice()等价于slice().retain(),需要调用一次release(),否则报错
retainedDuplicate等价于duplicate().retain(),需要调用一次release(),否则报错

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ladymorgana

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值