ByteBuf

ByteBuf

1 ByteBuffer问题

1.1 长度固定
1.2 只有一个位置指针
1.3 api功能有限

2 ByteBuf

使用聚合的方式实现

2.1 核心

通过两个位置指针辅助缓存区的读写操作。
读操作使用readerIndex
写操作使用writerIndex
对writ进行封装,如果缓存区不足,将会自动扩容。

2.2 操作
2.2.1 read
  1. readBoolean
  2. readByte
  3. readUnsignedByte
  4. readShort
  5. readUnsignedShort
  6. readMedium
  7. readUnsignedMedium
  8. readInt
  9. readUnsignedInt
  10. readLong
  11. readChar
  12. readFloat
  13. readDouble
  14. readBytes(int length)。
    将当前ByteBuf中的数据读取到新创建的ByteBuf中,读取长度为length,返回ByteBuf的readerIndex为0,writeIndex为length
  15. readSlice(int length)。
    返回当前ByteBuf新创建的子区域,子区域与原ByteBuf共享缓冲区,但是独立维护自己的readerIndex和writerIndex
  16. readBytes(ByteBuf dsf)
    将当前ByteBuf的数据读取到目标ByteBuf中,直到目标ByteBuf中没有剩余空间
  17. readBytes(ByteBuf dsf, int length)。将当前ByteBuf中的数据读取到目标ByteBuf中,读取长度为length
  18. readBytes(ByteBud dsf, int dstIndex, int length)
  19. readBytes(btye[] dst)
  20. readBytes(byte[]dst, int dstIndex, int length)
  21. readBytes(ByteBuffer dsf)
  22. readBytes(OutputStream out, int length)
  23. readBytes(GateringBtyeChannel out, int length)
2.2.2 write
  1. writeBoolean
  2. writeByte
  3. writeShort
  4. writeMedium
  5. writeInt
  6. writeLong
  7. writeChar
  8. writeBytes(ByteBuf src)
  9. writeBytes(ByteBuf src, int length)
  10. writeBytes(ByteBuf src, int srcIndex, int length)
  11. writeBytes(byte[] src)
  12. writeBytes(byte[]src,int startIndex, int length)
  13. writeBytes(ByteBuffer src)
  14. writeBytes(InputStream in, int length)
  15. writeBytes(ScatteringByteChannel in, int length)
  16. writeZero(int length)
2.2.3 index
  1. readerIndex。读索引
  2. writeIndex。写索引
2.2.4 discardedReadBytes。

回收已读空间会发生字节数组的内存复制。

2.2.5 readableBytes

可读字节数

2.2.6 writeableBytes

可写字节数

2.2.7 clear

重置位置指针

2.2.8 mark&rest
  1. markReaderIndex。将readerIndex备份到markedReaderIndex中
  2. resetReaderIndex。将当前的readerIndex设置为markedReaderIndex
  3. markWriterIndex。将当前的writerIndex备份到markedWriterIndex中
  4. resetWriterIndex。将writerIndex设置为markedWriterIndex
2.2.9 查找
  1. indexOf
  2. bytesBefore
  3. forEachByte
  4. forEachByteDesc
2.2.10 Derived buffers
  1. duplicate。
    浅复制,复制后的ByteBuf与原ByteBuf共享缓存区内容,但是独立维护自己的读写索引。
  2. copy。深复制,新的ByteBuf与老的ByteBuf内容和索引全部独立
  3. slice。返回当前ByteBuf的可读子缓存区,起始位置从readerIndex到writerIndex,两者共享缓存区,独立读写索引
2.2.11 转换
  1. nioBuffer
  2. nioBudder(int index, int length)
2.2.12 随机读写(set、get)

set和write操作不同的是它不支持动态缓冲区,使用者必须保证当前缓冲区可写的自己数大于需要写入的字节长度。

3 内存分配

3.1 堆内存
3.2 直接内存

4 pool

wenxinzizhu wechat
扫一扫,添加我的微信,一起交流共同成长(备注为技术学习)