java - ByteBuf.arrayOffset 没用吗?

标签 java netty

我正在学习 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() 方法,它实现了 ByteBufalways 方法的实现仅返回 0,如下所示。

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

那么,ByteBuf#arrayOffset 是不是没用了?

最佳答案

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

所以对于 UnpooledHeapByteBuf 返回 0 的情况,但这并不意味着 ByteBuf 的其他实现不需要不同的实现。


该方法应该按照文档 的规定执行,您可以想象其他实现确实有一个与0不同的偏移量。例如,如果他们使用像 circular-array 这样的东西作为支持字节数组。

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

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

circular-array example


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

关于java - ByteBuf.arrayOffset 没用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45704388/

相关文章:

java - hibernate 查询以获取服务器时间而不转换为本地时区

java - 多端口 Netty 套接字服务器

java - jar 文件中的 Maven Artifact 版本号

java - 没有互联网显示对话框

java - 关闭 Netty UDP 服务器

io.netty.channel.AbstractChannel$AnnotatedConnectException : Connection Time out: No further Information:

java - 在 Play 上强制执行 SSL!框架

kotlin - 未调用 ktor 中的应用程序级事件

java - 从数组打印信息,不使用重复值

Java注解在注解声明中执行一个方法(用于android)