我遇到了这个问题:Create a ByteBuf in Netty 4.0关于从byte []到ByteBuf和ByteBuffer到ByteBuf的转换。我很想知道转换的另一种方式:
io.netty.buffer.ByteBuf to 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的内部缓冲区。
谢谢!
答案 0 :(得分:11)
您应该可以使用ByteBuf.nioBuffers()。这将返回ByteBuf
的视图作为ByteBuffer对象的数组。
在大多数情况下,这个数组只有一个元素,但在ByteBuf
的一些更复杂的实现中,可能有多个底层的ByteBuffer对象,而ByteBuf.nioBuffers()
可以按原样返回它们而不是合并他们和ByteBuf.nioBuffer()
的号召一样。
您可以使用ByteBuf.nioBufferCount()
答案 1 :(得分:6)
您至少可以使用ByteBuffer.wrap()
来避免第二次复制。
答案 2 :(得分:2)
不是特别有效,但做的伎俩:
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);
}