我在行动中学习 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;
}
是无用的吗?
答案 0 :(得分:1)
ByteBuf
可能还有其他实现,并且可能有更多有用甚至复杂实现。
因此UnpooledHeapByteBuf
返回0
的情况有效,但这并不意味着ByteBuf
的其他实现不需要不同的实现。
该方法应该执行文档所述的内容,您可以想象其他实现确实具有不同到0
的偏移量。例如,如果他们使用类似循环数组的内容作为后备字节数组。
在这种情况下,该方法需要返回当前开始指针所在的索引,而不是0
。
这是一个显示这样一个圆形数组的示例图像(当前指针位于索引2
而不是0
,它在使用时在数组周围移动):
在用户端上,如果您想安全使用您的ByteBuf
对象,您也应该使用该方法。如果您在UnpooledHeapByteBuf
上操作,则可以避免使用它,但即便如此,您也不应该这样做,因为它们可能会改变未来版本的内部行为。
答案 1 :(得分:0)
不,它根本没用,因为它允许我们有一个巨大的字节数组支持多个ByteBuf实现。这实际上是在PooledHeapByteBuf
中完成的