netty (五) bytebuf

版权声明:转载请注明出处 https://blog.csdn.net/Lee_Suoer/article/details/85159757

是一个0个或者多个字节,允许随机访问和顺序访问。这个接口为一个或者多个byte数组和nio buffer提供了一个抽象的视图。

推荐使用unpooled的辅助方法来创建一个新的buffer,而不是去调用它每个实现类的构造方法。

像普通的原生的byte数组一样,butebuf的索引也是从0开始。第一个元素索引是0,最后一个是capacity-1

使用案例:

bytebuf 内部有两个指针变量来支持顺序读写操作,readindex针对读操作,writeindex来针对写操作。这两个指针将butebuf分为三个模块  :  discardable buyes,readable bytes,writeable bytes

readable bytes

这个区域存储实际的数据。任何的read或者skip操作都会读取或者跳过当前readindex并且使readindex增长读取到的字节的数量。如果参数是个bytebuf,并且没有指定目标索引,那么这个bytebuf的writeindex就会增加。(也就是读入这个buytebuf)。如果没有足够的空间就抛异常。新申请的或者包装的或者复制的buffer它的readindex是0

writeable bytes

这个区域是可以被填充的。任何以write名字开始的操作都会从当前的writeindex索引开始并且增加write bytes的数量。如果参数是一个bytebuf并且没有指定源索引,,那么readindex将会增加(也就是从这个bytebuf往输出设备上读出),如果没有足够的可写入的空间也会抛出异常。新申请的或者包装的或者复制的buffer它的writeindex是0

这个区域是read操作已经读取过的了,初始化的时候这个区域大小是0.当readindex达到writeindex的时候,可以通过discardReadBytes()方法来回收这个区域。

在调用discardReadBytes方法之后不保证writeable区域的内容。根据底层的实现不同,writeable区域可能不会发生移动并且会被填充不同的数据。

调用Clear方法可以使readindex和writeindex设置为零

将会有两个mark index,一个是存储readindex,另一个是存储writeindex,都可以通过reset来重置。

duplicate一个buffer会拥有新的readindex,writeindex和markindex,但是底层会共享原来的buffer。如果想复制底层的buffer要使用copy方法。

转换成其他jdk类型。

猜你喜欢

转载自blog.csdn.net/Lee_Suoer/article/details/85159757