繁体   English   中英

ByteBuf.arrayOffset没用吗?

[英]Is ByteBuf.arrayOffset useless?

我正在学习Netty in Action。

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了实现ByteBufarrayOffset()方法。 该方法的实现始终只返回0 ,如下所示。

@Override
public int arrayOffset() {
    return 0;
}

那么, ByteBuf#arrayOffset没用的吗?

ByteBuf可能还有其他实现,它们可能有更有甚至更复杂的实现。

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


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

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

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

圆阵列示例


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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM