一、创建


1、池化创建 ByteBufAllocator


获取ByteBufAllocator

Channel channel = ...;ByteBufAllocator allocator = channel.alloc();  
 //1 
 ....ChannelHandlerContext ctx = ...;ByteBufAllocator allocator2 = ctx.alloc();  
 //2


ByteBufAllocator中创建byteBuf的方法


名称

描述

buffer() buffer(int) buffer(int, int)

Return a ByteBuf with heap-based or direct data storage.

heapBuffer() heapBuffer(int) heapBuffer(int, int)

Return a ByteBuf with heap-based storage.

directBuffer() directBuffer(int) directBuffer(int, int)

Return a ByteBuf with direct storage.

compositeBuffer() compositeBuffer(int) heapCompositeBuffer() heapCompositeBuffer(int) directCompositeBuffer()directCompositeBuffer(int)

Return a CompositeByteBuf that can be expanded by adding heapbased or direct buffers.

ioBuffer()

Return a ByteBuf that will be used for I/O operations on a socket.


2、Unpooled (非池化)缓存


当未引用 ByteBufAllocator 时,上面的方法无法访问到 ByteBuf。对于这个用例 Netty 提供一个实用工具类称为 Unpooled,,它提供了静态辅助方法来创建非池化的 ByteBuf 实例。表5.9列出了最重要的方法


Table 5.9 Unpooled helper class


名称

描述

buffer() buffer(int) buffer(int, int)

Returns an unpooled ByteBuf with heap-based storage

directBuffer() directBuffer(int) directBuffer(int, int)

Returns an unpooled ByteBuf with direct storage

wrappedBuffer()

Returns a ByteBuf, which wraps the given data.

copiedBuffer()

Returns a ByteBuf, which copies the given data


在 非联网项目,该 Unpooled 类也使得它更容易使用的 ByteBuf API,获得一个高性能的可扩展缓冲 API,


3、 ByteBufUtil创建 (ByteBufUtil中有很多操作buf的API)



二、读 get/read get不会改变读索引,read会改变读索引


getBoolean(int)

返回当前索引的 Boolean 值

getByte(int) getUnsignedByte(int)

返回当前索引的(无符号)字节

getMedium(int) getUnsignedMedium(int)

返回当前索引的 (无符号) 24-bit 中间值

getInt(int) getUnsignedInt(int)

返回当前索引的(无符号) 整型

getLong(int) getUnsignedLong(int)

返回当前索引的 (无符号) Long 型

getShort(int) getUnsignedShort(int)

返回当前索引的 (无符号) Short 型

getBytes(int, ...)

字节



方法名称

描述

readBoolean() 

 返回当前索引的Boolean值,读索引加一

readByte() 



readUnsignedByte() 

返回当前索引的(无符号)字节,读索引加一

readMedium() 



readUnsignedMedium() 

返回当前索引的 (无符号) 24-bit 中间值,读索引加3

readInt() 



readUnsignedInt()

 返回当前索引的(无符号) 整型,读索引加4

readLong() 



readUnsignedLong() 

 返回当前索引的 (无符号) Long 型,读索引加8

readShort() 



readUnsignedShort() 

返回当前索引的 (无符号) Short 型,读索引加2

readBytes(int,int, ...)

、放回当前位置到length



得一个字节数组,读索引加length




三、写操作 set/write


方法名称

描述

setBoolean(int, boolean)

在指定的索引位置设置 Boolean 值

setByte(int, int)

在指定的索引位置设置 byte 值

setMedium(int, int)

在指定的索引位置设置 24-bit 中间 值

setInt(int, int)

在指定的索引位置设置 int 值

setLong(int, long)

在指定的索引位置设置 long 值

setShort(int, int)

在指定的索引位置设置 short 值



方法名称

描述

writeBoolean(boolean)

在指定的索引位置设置 Boolean 值,写索引加一

writeByte(int)

在指定的索引位置设置 byte 值,写索引加一

writeMedium(int)

在指定的索引位置设置 24-bit 中间 值,写索引加3

writeInt(int)

在指定的索引位置设置 int 值,写索引加4

writeLong(long)

在指定的索引位置设置 long 值,写索引加8

writeShort(int)

在指定的索引位置设置 short 值,写索引加2

writeBytes(int,...)

 在当前索引写入一个Byte数组,写索引加数组长度



四、索引管理


markReaderIndex(),



 markWriterIndex()

标记读(写)索引

resetReaderIndex()



resetWriterIndex()

读(写)索引回到mark标记的索引值

readerIndex(int)



 writerIndex(int) 

将读(写)索引设置到指定位置

clear()

可以同时设置 readerIndex 和 writerIndex 为 0。这不会清除内存中的内容



五、查找


for EachByte(ByteBufProcessor.FIND_NUL)

查找byte,返回byte的索引



六、副本


duplicate()



slice()



slice(int, int)



readOnly(),



order(ByteOrder) 

所有这些都返回一个新的 ByteBuf 实例包括它自己的 reader, writer 和标记索引。然而,内部数据存储共享就像在一个 NIO 的 ByteBuffer

 copy()



 copy(int, int)

返回的 ByteBuf 有数据的独立副本。



七、其他


方法名称

描述

isReadable()

返回是否有字节可读

isWritable()

返回是否可以写

readableBytes()

返回可以读的字节长度

writablesBytes()

返回可以写的字节场地

capacity()

返回byteBuf的容量

maxCapacity()

返回byteBuf可以有的最大容量

hasArray()

如果byteBuf可以直接返回一个数组就返回true



(heap buf才会为true)

array()

hasArray返回true,该方法就会返回一个数组