我正在学习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没用的吗?

#1楼 票数:1 已采纳

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

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


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

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

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

圆阵列示例


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

#2楼 票数:0

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

  ask by Iconoclast translate from so

未解决问题?本站智能推荐:

1回复

java Netty从Bytebuf检索数据

我正在使用Java Netty 4读取外部tcp套接字以获取一些信息,它以Bytebuf的形式返回结果,并且如所附的屏幕截图所示,打印效果很漂亮 我浏览了Bytebuf api,发现有很多方法可以解析和读取Bytebuf内容。 我需要将第3列中的String数据读取为java St
1回复

Netty java从ByteBuf获取数据

如何在下面的代码中有效地从ByteBuf获取字节数组? 我需要获取数组然后序列化它。
1回复

为什么Netty客户返回Observable >而不是可观察的 ?

教程/示例显示: 我知道字节可能成块出现,因此我了解Observable<ByteBuf> 。 但是为什么要使用Observable<HttpClientResponse> ? 为什么不只有1个提供Observable<ByteBuf> Htt
1回复

Netty的ByteBuf.copy()和ByteBuf.duplicate()之间的区别

乍一看,它们似乎很相似。 我的理解是, copy()创建基础内容的副本,而duplicate()不会。 准确吗? 在哪种情况下,您会使用一种?
1回复

如何将AggregatedFullHttpRequest转换为ByteBuf

我使用netty HexDumpProxyBackendHandler示例作为我的代理服务器的基础。 我的管道: 在ProxyFrontendHandler我尝试在将HttpRequest对象发送到后端服务器之前对其进行修改。 因此,我在channelRead方法中获得了Aggre
3回复

ByteBuf初始容量大小

请给我建议如何增加我的ByteBuf初始容量。 在这种情况下: 如果收入消息超过ByteBuf的最大容量 - 我得到切割数据。 对于这个项目来说,获取完整的非分块信息至关重要。 我想我需要在bootstraps childOptions中的某个位置设置ByteBuf的初始容量
1回复

使用ByteBuf的Bytebuffer包装

我想使用netty.ByteBuf包装nio.bytebuffer而不创建新对象,因为我想切片nio.bytebuffer 。 但是java.nio没有像netty这样的工具。
3回复

Netty 将 HttpRequest 转换为 ByteBuf

在我的应用程序中,我需要在套接字上接收一个字节数组,将其解析为HttpRequest以执行一些检查,如果检查通过,返回到字节数组并做一些更多的工作。 该应用程序基于 NETTY(这是一项要求)。 我的第一个想法是创建一个像这样的管道: HttpRequestDecoder (从ByteB