netty io.netty.buffer简介
2019独角兽企业重金招聘Python工程师标准>>>
io.netty.util.ReferenceCounted
此接口代表一个引用计数的对象,此对象需要显示的释放.
当一个ReferenceCounted
对象被实例化的时候,该对象的引用数量就是1,调用retain()
方法会增加引用数量,调用 release()
方法会减少引用数量,如果引用数量减少到0,该对象就需要显示释放掉。访问释放掉的对象通常会导致访问冲突。
如果实现ReferenceCounted
接口的对象是一个包含同样实现ReferenceCounted
接口的对象的容器。当容器的引用数量变为0的时候,容器中的对象也要通过release()
方法来释放掉。
主要方法:
int refCnt(); //返回当前对象的引用数量,如果返回零,说明当前对象已经被释放掉了
ReferenceCounted retain();//引用数量增加1
ReferenceCounted retain(int increment);//引用计数增加给定值increment
ReferenceCounted touch();\\此方法记录对象的当前访问位置,主要用来调试。如果确定当前对象内存泄露,通过此操作记
\\录的信息将通过ResourceLeakDetector提供给你
ReferenceCounted touch(Object hint);\\此方法记录对象的当前访问位置并附加一个hint对象,主要用来调试。如果
\\确定当前对象内存泄露,通过此操作记录的信息将通过ResourceLeakDetector提供给你
boolean release();\\引用计数减1,如果引用计数变为0了,则显示的释放掉该对象,当且仅当引用计数变为0且该对象已
\\被释放掉才返回ture,否则返回false
boolean release(int decrement);\\引用计数减少给定值decrement,如果引用计数变为0了,则显示的释放掉该对象,
当且仅当引用计数变为0且该对象已被释放掉才返回ture,否则返回false
io.netty.buffer.ByteBuf
这是一个随机和顺序访问的序列其包含0或者多个字节,此接口为一个或者多字节数组和NIO buffers提供了一个抽象试图
创建buffer
建议使用辅助方法创建一个新的缓冲区不要调用具体实现的构造函数。
随进访问索引
就像普通的byte数组一样,ByteBuf使用基于0的索引,也就是第一个的索引是0最后一个元素的索引是capacity-1,下面举例迭代访问buffer中的所有字节,做如下操作的时候你可以忽略其内部实现:
ByteBuf buffer = ...;for (int i = 0; i < buffer.capacity(); i ++) {byte b = buffer.getByte(i);System.out.println((char) b);}
顺序访问索引
ByteBuf
提供了两个指针变量来分别支持读和写操作,readerIndex
用于读操作,
writerIndex
用于写操作. 下面的图展示了一个buffer使如何被两个指针分割成三个区域的:
+-------------------+------------------+------------------+| discardable bytes | readable bytes | writable bytes || | (CONTENT) | |+-------------------+------------------+------------------+| | | |0 <= readerIndex <= writerIndex <= capacity
discardable bytes代表可废弃的区域,readable bytes代码可读区域,writable bytes代表可写区域 readerIndex代表读的起点,writerIndex代表写的起点,capacity代表容量
可读区域(实际内容)
这个区域存储的是实际的数据或者叫有效的数据. 任何以read或者skip开头的操作(任何是指本类中的任何方法)都会得到或者跳过当前readerIndex指示的数据,并且readerIndex会根据读取或者跳过的字节数自增。如果读取 操作的参数也是一个Byte并且没有指定目标ByteBuf的起始index,则该参数ByteBuf的writerIndex也要跟着一起增长。
如果没有足够的数据供读取则报IndexOutOfBoundsException。新分配、wrapped或者拷贝的buffer,其readerIndex是0.相关读取操作如下:
// Iterates the readable bytes of a buffer. ByteBuf buffer = ...;while (buffer.readable()) {System.out.println(buffer.readByte());}
可写数据区域
此区域是未定义的区域也就是需要往里面写数据的区域。任何以write开始的操作(任何是指本类中的任何方法)将会从writerIndex开始写数据,并且writerIndex会根据写入的数量增加。如果write操作的参数也是一个ByteBuf并且没有制定源Buff的开始index, 那么该参数ByteBuf的readerInx也要跟着一起增长.
如果没有足够的空间供写入报
IndexOutOfBoundsException
,新分配的buffer的writerIndex是0. wrapped 或者copy的 bufferwriterIndex 等于capacity。写入操作代码:
// Fills the writable bytes of a buffer with random integers. ByteBuf buffer = ...;while (buffer.maxWritableBytes() >= 4) {buffer.writeInt(random.nextInt());}
可废弃区域
这个区域包含的是通过读操作读完的数据区域.初始状态这个区域的大小是0
, 随着读操作的调用这个区域会增长到writerIndex的大小. 读过的数据可以通过调用discardReadBytes()方法回收该区域,该方法的功能如下
:
BEFORE discardReadBytes()//操作前+-------------------+------------------+------------------+| discardable bytes | readable bytes | writable bytes |+-------------------+------------------+------------------+| | | |0 <= readerIndex <= writerIndex <= capacityAFTER discardReadBytes()//操作后+------------------+--------------------------------------+| readable bytes | writable bytes (got more space) |+------------------+--------------------------------------+| | |readerIndex (0) <= writerIndex (decreased) <= capacity
需要注意的是,不能保证可写区域的数据内容,可写区域的内容多数情况下不会跟着移动,甚至有可能被不同的数据填充,这依赖于具体的buffer实现。
清空缓冲索引
你可以通过调用clear()方法来将
readerIndex
和 writerIndex
设置为 0
. 但是不会清除内容,而只是重置了两个指针. 注意这里的clear()方法语义和java.nio.Buffer.clear()语义是不一样的。
BEFORE clear()+-------------------+------------------+------------------+| discardable bytes | readable bytes | writable bytes |+-------------------+------------------+------------------+| | | |0 <= readerIndex <= writerIndex <= capacityAFTER clear()+---------------------------------------------------------+| writable bytes (got more space) |+---------------------------------------------------------+| |0 = readerIndex = writerIndex <= capacity
search相关操作
对于简单的字节搜索,使用 indexOf(int, int, byte)
和 bytesBefore(int, int, byte)
. bytesBefore(byte)
. 对于复杂的搜索使用 forEachByte(int, int, ByteBufProcessor)
方法,该方法需要一个 ByteBufProcessor
的实现类.
标记和充值 (mark reset)
每个buffer有两个marker indexes. 一个用来存储 readerIndex
另一个用来存储 writerIndex
. 可以通过调用reset方法重置,其工作方式类似于InputStream中的mark和reset方法,不同的是其没有readlimit参数.
派生缓冲区(Derived buffers)
你可以通过调用方法duplicate()
, slice()
or slice(int, int)
来根据现有buffer创建一个试图(view) . 一个派生的buffer会有一个独立的readerIndex
, writerIndex
和 marker indexes,同时会共享内部数据,这和Java NIO一样.如果要完整拷贝一个buffer,需要调用copy()
方法.
转换成现有的JAVA类型
Byte array
如果ByteBuf内部实现是一个byte[], 可以通过调用
array()
方法来访问数组. 判断是否是byte[]可以调用hasArray()
方法.NIO Buffers
通过调用
nioBuffer()
方法可以得到一个NIO buffer,判断能否进行转换可以调用nioBufferCount()
方法.Strings
可以调用提供的多个
toString(Charset)
方法将ByteBuf
转换为String
. 需要注意的是,toString()
不是转换方法,而是继承Object的toString()方法I/O Streams
参考
ByteBufInputStream
和ByteBufOutputStream
.
io.netty.buffer.ByteBufAllocator
该接口的实现类负责创建buffer,接口实现类必须是线程安全的。
io.netty.buffer.ByteBufHolder
发送接收的数据包
io.netty.buffer.AbstractByteBuf
实现bytebuf的一个骨架
io.netty.buffer.AbstractByteBufAllocator
ByteBufAllocator
的骨架
io.netty.buffer.AbstractDerivedByteBuf
Bytebuf的一个抽象基类,其主要功能是实现了能够封装另一个Bytebuf
io.netty.buffer.AbstractReferenceCountedByteBuf
ByteBuf的一个抽象基类,主要功能是实现了引用计数的功能,即ReferenceCounted借口的功能(retain和release、touch方法)
io.netty.buffer.ByteBufInputStream
继承了InputStream类,该类可以从ByteBuf中读取数据,对该对象进行读操作的时候内部buffer的readerIndex也会增加,需要注意的是读取的字节数量在初始化该对象的时候已经确定了(构造函数内部,初始化的时候已经和设置了长度),后面在对该buffer写数据,对该对象来讲,不会读到。
改流还是DataInput
借口,字节的序列并不总是大端序列(big endian),这取决于内部buffer实现
io.netty.buffer.ByteBufOutputStream
继承了OutputStream类,该类可以向ByteBuf中写数据,对该对象进行写操作的时候内部buffer的writerindex也会增加,改流还是DataOutput
借口,字节的序列并不总是大端序列(big endian),这取决于内部buffer实现
io.netty.buffer.ByteBufUtil
这是一个处理ByteBuf对象的一些方法的工具类.
io.netty.buffer.CompositeByteBuf
这是一个虚拟bufer,实际上是一个组合buffer,其内部封装了多个buffer,其功能就是将多个buffer组合成一个buffer,推荐使用ByteBufAllocator.compositeBuffer()
或者Unpooled.wrappedBuffer(ByteBuf...)来创建CompositeByteBuf对象,不要直接调用构造函数来创建对象
io.netty.buffer.DefaultByteBufHolder
ByteBufHolder
的默认实现,期功能就是把数据存储在bytebuf中
io.netty.buffer.DuplicatedByteBuf
一个派生buffer,简单的把所有的数据访问请求发送给内部的buffer。简易通过ByteBuf.duplicate()
方法来创建该对象。该对象与其内部bufer共享数据,只不过二者的readerindex和writerindex是独立的。
io.netty.buffer.EmptyByteBuf
这是一个空的ByteBuf,容量是0
io.netty.buffer.PooledByteBufAllocator
带缓冲的ByteBufAllocator
io.netty.buffer.ReadOnlyByteBuf
这个一个派生buffer,他禁止写操作发送给内部buffer,简易通过 Unpooled.unmodifiableBuffer(ByteBuf)
方法来创建对象
io.netty.buffer.SliceByteBuf
一个派生buffer,他的功能是仅仅暴露内部buffer的一个自区域,就是切片,推荐通过ByteBuf.slice()
andByteBuf.slice(int, int)
方法来创建对象
io.netty.buffer.SwappedByteBuf
一个包装buffer,其功能是交换bytebuf的字节序列,即大端序列和小端序列的转换
io.netty.buffer. Unpooled
io.netty.buffer.UnpooledByteBufAllocator
带缓冲的ByteBufAllocator
io.netty.buffer.UnpooledDirectByteBuf
基于NIO ByteBuffer
的ByteBuf,推荐通过调用Unpooled.directBuffer(int)或者
Unpooled.wrappedBuffer(ByteBuffer)方法来创建对象
io.netty.buffer.UnpooledHeapByteBuf
大端序列的java堆buffer实现
io.netty.buffer.Unpooled
相当于一个工具类,可以创建Bytebuf
转载于:https://my.oschina.net/u/2376392/blog/490973
netty io.netty.buffer简介相关推荐
- netty : io.netty.handler.codec.TooLongFrameException
文章目录 背景 背景 做netty权威指南的私有协议开发,案例报错如 io.netty.handler.codec.TooLongFrameException: Adjusted frame leng ...
- 【Netty】Netty 简介 ( 原生 NIO 弊端 | Netty 框架 | Netty 版本 | 线程模型 | 线程 阻塞 IO 模型 | Reactor 模式引入 )
文章目录 一. NIO 原生 API 弊端 二. Netty 简介 三. Netty 架构 四. Netty 版本 五. Netty 线程模型 六. 阻塞 IO 线程模型 七. 反应器 ( React ...
- 【Netty】IO 模型简介 ( Netty 特点 | Netty 应用场景 | Java 三种 IO 模型 | BIO 模型 )
文章目录 I . Netty 简介 II . Netty 应用场景 III . Java I/O 模型 IV . BIO 概念 V . BIO 开发流程 VI . BIO 实例 VII . BIO 模 ...
- netty4 io.netty.util.IllegalReferenceCountException: refCnt: 0, decrement: 1
在netty4中,对象的生命周期由引用计数器控制,ByteBuf就是如此,每个对象的初始化引用计数加1,调用一次release方法,引用计数器会减1,当尝试访问计数器为0时,对象时,会抛出Illega ...
- class io.netty.util.internal.PlatformDependent0$6 cannot access class jdk.internal.misc.Unsafe
在使用 netty框架时发现在DEBUG模式下报错,但是不影响正常功能使用.就是看着不爽.解决办法是升级Netty 版本 "C:\Program Files\Java\jdk-11.0.7\ ...
- Netty对Protocol Buffer多协议的支持(八)
Netty对Protocol Buffer多协议的支持(八) 一.背景 在上篇博文中笔者已经用代码演示了如何在netty中使用Protocol Buffer,然而细心的用户可能会发现一个明显的不足之处 ...
- vertx:Flink报错 严重: Caught unexpected Throwable IllegalAccessError: tried to access class io.netty.uti
1.视界 2. flinkSQL程序报错 十月 20, 2019 11:56:10 下午 io.vertx.core.impl.TaskQueue 严重: Caught unexpected Thro ...
- Netty 5 io.netty.util.IllegalReferenceCountException 异常
Netty 5 io.netty.util.IllegalReferenceCountException 异常 参考文章: (1)Netty 5 io.netty.util.IllegalRefere ...
- springboot启动报错Exception in thread “main“ java.lang.NoClassDefFoundError: io/netty/util/Timer
原因: 这是缺少netty包的原因. 解决方法: 加入一下依赖: <!-- https://mvnrepository.com/artifact/io.netty/netty-all --> ...
最新文章
- 【工作经验分享】mysql备份恢复命令
- 监控摄像机选型攻略之有无必要性
- admin select 2 异步_解决Angularjs异步操作后台请求用$q.all排列先后顺序问题
- leetcode51. N皇后
- java系统源代码_JAVA学生管理系统源代码
- 想法独特 上半年最具特色摄像头集锦
- GNSS_NMEA 0183协议的校验和计算方法_C/C++
- python排版word文档 效率,【效率工具】用Python根据excel中数据批量生成word文档(适用劳...
- 简述计算机配件选购的一般原则和流程,计算机维护与维修教学全套课件(刘云霞)(已检查完11 18)教学单元五选购与配置计算机.doc...
- ps快捷键大法(最全)
- Period、Duration计算时间间隔
- 【无人驾驶系列七】高精度地图在无人驾驶中的应用
- 403 forbidden 错误解决方案
- 虚拟机怎么装服务器系统教程视频,云服务器装虚拟机教程视频
- 数据挖掘基本流程 CRISP-DM --项目实战总结 可操作性强
- b区计算机专业调剂容易的学校,2021考研b区容易调剂的学校有哪些
- 计算机能够快速准确,计算机操作练习题
- 批量挖sql注入漏洞
- Raid Card CC(consistency check )
- Android 分析ANR和死锁(1)