当前位置: 首页 > 知识库问答 >
问题:

转换io的有效方法。内蒂。缓冲器从ByteBuf到java。尼奥。ByteBuffer

卜和悌
2023-03-14

我遇到了这样一个查询:在Netty4.0中创建一个关于从byte[]到ByteBuf以及从ByteBuffer到ByteBuf的转换的ByteBuf。我很想通过另一种方式了解转换:

io.netty.buffer.ByteBufjava.nio.ByteBuffer

以及如何高效地执行此操作,而不进行复制?我读了一些书,经过反复试验,我发现这种转换方式效率低下(有两份副本):

// io.netty.handler.codec.http.FullHttpRequest fullHttpRequest;
ByteBuf conByteBuf = fullHttpRequest.content ();                  
int numReadBytes = conByteBuf.readableBytes ();
conBytes = new byte[numReadBytes];
conByteBuf .readBytes (conBytes);                                // First Copy
ByteBuffer conByteBuffer = ByteBuffer.allocate (conBytes.length);
conByteBuffer.put (conByteBuf);                                  // Second Copy

我的问题是,我们可以避免一个或两个副本,并使ByteBuffer的内部缓冲区使用ByteBuf的内部缓冲区。

谢谢

共有3个答案

李经国
2023-03-14

不是特别有效率,但要做到:

public static ByteBuffer toNioBuffer(ByteBuf buffer) {
    if (buffer.isDirect()) {
        return buffer.nioBuffer();
    }
    final byte[] bytes = new byte[buffer.readableBytes()];
    buffer.getBytes(buffer.readerIndex(), bytes);
    return ByteBuffer.wrap(bytes);
}
慕容俭
2023-03-14

您至少可以使用ByteBuffer。wrap()以避免第二次复制。

东门清夷
2023-03-14

您应该能够使用ByteBuf。nioBuffers()。它将以ByteBuffer对象数组的形式返回ByteBuf的视图。

在大多数情况下,该数组只有一个元素,但在一些更复杂的ByteBuf实现中,可能有多个底层ByteBuffer对象和ByteBuf。nioBuffers()可以按原样返回它们,而不是像调用ByteBuf那样合并它们。nioBuffer()

通过使用ByteBuf,您可以提前知道数组长度。nioBufferCount()

 类似资料:
  • 我发现我的一个spring boot项目的内存(RAM消耗)正在日益增加。当我把jar文件上传到AWS服务器时,它占用了582MB的内存(分配的最大内存是1500MB),但每天,内存都在以50MB的速度增加到100MB,而今天,5天后,它占用了835MB。目前,该项目有100-150个用户,并且正常使用Rest API。 由于RAM的增加,应用程序多次出现以下错误(从日志中发现错误): 所以为了解

  • SPARK 2.3抛出以下异常。有人能帮忙吗!!我试着加入罐子 308 [驱动程序] 错误 org.apache.spark.deploy.yarn.ApplicationMaster - 用户类抛出异常:java.lang.NoSuchMethodError: io.netty.buffer.PooledByteBufAllocator.metric()Lio/netty/buffer/Pool

  • 我知道如何清除缓存以供查看: ,但我还需要其他东西-删除controller方法中应用程序的所有缓存。怎么做?

  • 是否有任何方法可以使用实现文件追加器,它将在内存中存储特定大小的日志,然后将日志写入文件(本地/远程) 有什么办法可以做到这一点吗? 在log4j2文档中: FastFileAppender与标准的类似,只是它总是被缓冲(不能关闭),并且在内部使用而不是。与使用“” bufferedIO:(布尔值)的FileAppender相比,我们看到了20-200%的性能改进。如果为true,则默认情况下,当

  • 我在读这样一个文件: 文件如下所示: 我是这样分析的: 这里没有显示与每一行相关的代码。对于某些行,我想跳回到某个行号,并再次继续阅读文件。最好的方法是什么?我必须创建另一个读取器并跳过行,直到我感兴趣的特定行吗?我正在沿着这篇文章的思路看,但我想继续阅读文件的其余部分。

  • 这是一个简单的应用程序: 从主页按ADD时,将显示New Ionic页面。 用户键入标题和内容后,按Add,列表中将添加一条注释,然后应用程序导航回主页。我所做的是:-创建添加注释页。-在添加注释中。ts,我返回主页,如下所示: } 在添加注释中。html我定义了如下按钮: 我尝试this.navCtrl.popToRoot()但它不工作。 有人知道原因吗?