ByteBuf.arrayOffset没用吗?

时间:2017-08-16 02:52:56

标签: java netty

我在行动中学习 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的{​​{1}}方法。方法总是的实现只返回ByteBuf,如下所示。

0

那么,@Override public int arrayOffset() { return 0; } 是无用的吗?

2 个答案:

答案 0 :(得分:1)

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

因此UnpooledHeapByteBuf返回0的情况有效,但这并不意味着ByteBuf的其他实现不需要不同的实现。

该方法应该执行文档所述的内容,您可以想象其他实现确实具有不同0的偏移量。例如,如果他们使用类似循环数组的内容作为后备字节数组。

在这种情况下,该方法需要返回当前开始指针所在的索引,而不是0

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

circular-array example

用户端上,如果您想安全使用您的ByteBuf对象,您也应该使用该方法。如果您在UnpooledHeapByteBuf上操作,则可以避免使用它,但即便如此,您也不应该这样做,因为它们可能会改变未来版本的内部行为。

答案 1 :(得分:0)

不,它根本没用,因为它允许我们有一个巨大的字节数组支持多个ByteBuf实现。这实际上是在PooledHeapByteBuf

中完成的