Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将io.netty.buffer.ByteBuf转换为java.nio.ByteBuffer的有效方法_Java_Netty_Bytebuffer - Fatal编程技术网

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

将io.netty.buffer.ByteBuf转换为java.nio.ByteBuffer的有效方法,java,netty,bytebuffer,Java,Netty,Bytebuffer,我遇到了这个查询:关于从byte[]到ByteBuf以及从ByteBuffer到ByteBuf的转换。我很想通过另一种方式了解转换: io.netty.buffer.ByteBuf到java.nio.ByteBuffer 以及如何高效地执行此操作,而不进行复制?我读了一些书,经过反复试验,我发现这种转换方式效率低下(有两份副本): 我的问题是,我们可以避免一个或两个副本,并使ByteBuffer的内部缓冲区使用ByteBuf的内部缓冲区 谢谢 您至少可以使用ByteBuffer.wrap()来避

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

io.netty.buffer.ByteBuf到java.nio.ByteBuffer

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

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


谢谢

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

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

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


您可以通过使用
ByteBuf.nioBufferCount()

提前知道数组长度,虽然效率不高,但要做到以下几点:

publicstaticbytebuffertoniobuffer(bytebuff缓冲区){
if(buffer.isDirect()){
返回buffer.nioBuffer();
}
最终字节[]字节=新字节[buffer.readableBytes()];
getBytes(buffer.readerIndex(),bytes);
返回ByteBuffer.wrap(字节);
}

我们仍然可以避免第一个副本吗?下面的Dev响应似乎有助于消除这一点。当它由字节[]@Dev支持时,当您使用
ByteBuf.nioBuffers()
ByteBuf.nioBuffer()
将ByteBuf的视图作为ByteBuffer对象数组或单个ByteBuffer对象返回时,这并不能解决问题,如果你要释放ByteBuf会发生什么?由于ByteBuff和ByteBuffer共享基础数据,因此创建的ByteBuffer对象似乎会出现问题。因此
ByteBuf.nioBuffer()
会自动将它们合并为一个吗?我可以直接调用它,而不是在
nioBuffers()
中迭代数组?
// 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