我在操作中学习 Netty 。
在 5.2.2 ByteBuf使用模式一章中,有一段代码使我感到困惑。如下所示。
ByteBuf heapBuf = ...
if (heapBuf.hasArray()) {
byte[] array = heapBuf.array();
int offset = heapBuf.arrayOffset() + heapBuf.readerIndex();
int lenght = heapBuf.readableBytes();
handleArray(array, offset, length)
}
我想知道
ByteBuf.arrayOffset()
方法的用例是什么。该方法的文档为:返回此缓冲区的后备字节数组中第一个字节的偏移量。
然后,我在
arrayOffset()
中查询了实现UnpooledHeapByteBuf.java
的ByteBuf
方法。方法的实现始终为,仅返回0
,如下所示。@Override
public int arrayOffset() {
return 0;
}
那么,
ByteBuf#arrayOffset
没用吗? 最佳答案
ByteBuf
可能有其他实现,并且有可能具有更有用甚至更复杂的实现。
因此,对于UnpooledHeapByteBuf
而言,返回0
可以工作,但这并不意味着ByteBuf
的其他实现不需要其他实现。
该方法应该执行文档所声明的操作,并且您可以想象其他实现的偏移量与0
的不同。例如,如果他们使用类似圆形数组这样的东西作为后备字节数组。
在那种情况下,该方法需要返回索引,它是当前起始指针所在的位置,而不是0
。
这是一个显示此类圆形数组的示例图像(当前指针位于索引2
而非0
处,它在使用时在数组周围移动):
在用户端上,如果要安全地使用和ByteBuf
对象,则也应使用该方法。如果您对UnpooledHeapByteBuf
进行操作,则可以避免使用它,但是即使那样也不要这样做,因为它们可能会在将来的版本中更改内部行为。