我在操作中学习 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.javaByteBuf方法。方法的实现始终为,仅返回0,如下所示。
@Override
public int arrayOffset() {
    return 0;
}

那么,ByteBuf#arrayOffset没用吗?

最佳答案

ByteBuf可能有其他实现,并且有可能具有更有用甚至更复杂的实现。

因此,对于UnpooledHeapByteBuf而言,返回0可以工作,但这并不意味着ByteBuf的其他实现不需要其他实现。

该方法应该执行文档所声明的操作,并且您可以想象其他实现的偏移量与0的不同。例如,如果他们使用类似圆形数组这样的东西作为后备字节数组。

在那种情况下,该方法需要返回索引,它是当前起始指针所在的位置,而不是0

这是一个显示此类圆形数组的示例图像(当前指针位于索引2而非0处,它在使用时在数组周围移动):

java - ByteBuf.arrayOffset没有用吗?-LMLPHP

用户端上,如果要安全地使用ByteBuf对象,则也应使用该方法。如果您对UnpooledHeapByteBuf进行操作,则可以避免使用它,但是即使那样也不要这样做,因为它们可能会在将来的版本中更改内部行为。

09-27 19:44