繁体   English   中英

将io.netty.buffer.ByteBuf转换为java.nio.ByteBuffer的有效方法

[英]Efficient way to convert io.netty.buffer.ByteBuf to java.nio.ByteBuffer

我遇到了这个问题: 在Netty 4.0中创建一个关于从byte []到ByteBuf和ByteBuffer到ByteBuf的转换的ByteBuf。 我很想知道转换的另一种方式:

io.netty.buffer.ByteBuf到java.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的内部缓冲区。

谢谢!

您应该能够使用ByteBuf.nioBuffers() 这将返回ByteBuf视图作为ByteBuffer对象的数组。

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

您可以使用ByteBuf.nioBufferCount()提前告诉数组长度是ByteBuf.nioBufferCount()

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

不是特别有效,但做的伎俩:

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);
}

暂无
暂无

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

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