我正在学习 Netty 实战。
在5.2.2 ByteBuf usage patterns一章中,有一段代码让我很困惑。如下所示。
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()
方法的用例是什么。该方法的文档如下:
Returns the offset of the first byte within the backing byte array of this buffer.
然后,我在 UnpooledHeapByteBuf.java
中查找了 arrayOffset()
方法,它实现了 ByteBuf
。 always 方法的实现仅返回 0
,如下所示。
@Override
public int arrayOffset() {
return 0;
}
那么,ByteBuf#arrayOffset
是不是没用了?
最佳答案
ByteBuf
可能还有其他实现,它们可能有更有用甚至复杂的实现。
所以对于 UnpooledHeapByteBuf
返回 0
的情况,但这并不意味着 ByteBuf
的其他实现不需要不同的实现。
该方法应该按照文档 的规定执行,您可以想象其他实现确实有一个与0
不同的偏移量。例如,如果他们使用像 circular-array 这样的东西作为支持字节数组。
在这种情况下,该方法需要返回当前开始指针 所在位置的索引,而不是0
。
这是一个示例图像,显示了这样一个圆形数组(当前指针位于索引 2
而不是 0
,它在使用它时围绕数组移动) :
并且在用户端,如果您想安全地使用您的ByteBuf
对象,您也应该使用该方法。如果你在 UnpooledHeapByteBuf
上操作,你可以避免使用它,但即使那样你也不应该使用它,因为它们可能会在未来的版本中改变内部行为。
关于java - ByteBuf.arrayOffset 没用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45704388/