容量相关
capacity()
表示 ByteBuf 底层占用了多少字节的内存(包括丢弃的字节、可读字节、可写字节)
maxCapacity()
表示 ByteBuf 底层最大能够占用多少字节的内存,当向 ByteBuf 中写数据的时候,如果发现容量不足,则进行扩容,直到扩容到 maxCapacity,超过这个数,就抛异常
readableBytes()
readableBytes() 表示 ByteBuf 当前可读的字节数,它的值等于 writerIndex-readerIndex,如果两者相等,则不可读,
isReadable()
ByteBuf可读不可读的方法,readableBytes()方法返回0,就不可读
writableBytes() isWritable() maxWritableBytes()
writableBytes() 表示 ByteBuf 当前可写的字节数,它的值等于 capacity-writerIndex,如果两者相等,则表示不可写, isWritable()返回0 。这个时候如果发现ByteBuf写不进去数据,Netty会自动扩容ByteBuf到底层内存大小maxCapacity。maxWritableBytes()表示可写的最大字节数,它的值等于maxCapacity-writerIndex
读写指针相关
readerIndex() 与 readerIndex(int)
前者表示返回当前的读指针 readerIndex, 后者表示设置读指针
writeIndex() 与 writeIndex(int)
前者表示返回当前的写指针 writerIndex, 后者表示设置写指针
markReaderIndex() 与 resetReaderIndex()
前者表示把当前的读指针保存起来,后者表示把当前的读指针恢复到之前保存的值
读写
writeBytes(byte[] src) 与 buffer.readBytes(byte[] dst)
<span style="color: rgb(51, 51, 51); font-family: -apple-system, system-ui, "Segoe UI", Roboto, Ubuntu, Cantarell, "Noto Sans", sans-serif, BlinkMacSystemFont, "Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", Arial; font-size: 15px;">writeBytes() 表示把字节数组 src 里面的数据全部写到 ByteBuf,而 readBytes() 指的是把 ByteBuf 里面的数据全部读取到 dst,这里 dst 字节数组的大小通常等于 readableBytes(),而 src 字节数组大小的长度通常小于等于 writableBytes()</span>
writeByte(byte b) 与 buffer.readByte()
writeByte() 表示往 ByteBuf 中写一个字节,而 buffer.readByte() 表示从 ByteBuf 中读取一个字节
<span style="color: rgb(102, 102, 102); font-family: -apple-system, system-ui, "Segoe UI", Roboto, Ubuntu, Cantarell, "Noto Sans", sans-serif, BlinkMacSystemFont, "Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", Arial; font-size: 15px; background-color: rgb(248, 248, 248);">release() 与 retain()</span>
Netty 的 ByteBuf 是通过引用计数的方式管理的,如果一个 ByteBuf 没有地方被引用到,需要回收底层内存。默认情况下,当创建完一个 ByteBuf,它的引用为1,然后每次调用 retain() 方法, 它的引用就加一, release() 方法原理是将引用计数减一,减完之后如果发现引用计数为0,则直接回收 ByteBuf 底层的内存。<br>
slice()、duplicate()、copy()
slice()
slice() 方法从原始 ByteBuf 中截取一段,这段数据是从 readerIndex 到 writeIndex,同时,返回的新的 ByteBuf 的最大容量 maxCapacity 为原始 ByteBuf 的 readableBytes().这个方法返回的ByteBuf和原ByteBuf共享同一块内存,如果返回的ByteBuf修改了数据,原ByteBuf的对应的数据也会跟着变化。但是返回的ByteBuf和原ByteBuf由自己独立的指针
<span style="color: rgb(51, 51, 51); font-family: -apple-system, system-ui, "Segoe UI", Roboto, Ubuntu, Cantarell, "Noto Sans", sans-serif, BlinkMacSystemFont, "Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", Arial; font-size: 15px;">duplicate()</span>
duplicate() 方法把整个 ByteBuf 都截取出来,包括所有的数据,指针信息。这个方法返回的ByteBuf和原ByteBuf共享同一块内存,如果返回的ByteBuf修改了数据,原ByteBuf的对应的数据也会跟着变化。但是返回的ByteBuf和原ByteBuf由自己独立的指针
<span style="color: rgb(51, 51, 51); font-family: -apple-system, system-ui, "Segoe UI", Roboto, Ubuntu, Cantarell, "Noto Sans", sans-serif, BlinkMacSystemFont, "Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", Arial; font-size: 15px;">copy()</span>
直接从原始的 ByteBuf 中拷贝所有的信息,包括读写指针以及底层对应的数据,因此,往 copy() 返回的 ByteBuf 中写数据不会影响到原始的 ByteBuf
retainedSlice() 与 retainedDuplicate()
相当于时调用slice方法和duplicate方法的时候调用retain方法,增加引用次数
set/get
虽然也可以读写数据,但是不会修改指针位置