Netty Java从ByteBuf获取数据

如何ByteBuf在下面的代码中有效地获取字节数组?我需要获取数组,然后对其进行序列化。

package testingNetty;

import io.netty.buffer.ByteBuf;

import io.netty.channel.ChannelHandlerContext;

import io.netty.channel.ChannelInboundHandlerAdapter;

public class ServerHandler extends ChannelInboundHandlerAdapter {

@Override

public void channelRead(ChannelHandlerContext ctx, Object msg) {

System.out.println("Message receive");

ByteBuf buff = (ByteBuf) msg;

// There is I need get bytes from buff and make serialization

byte[] bytes = BuffConvertor.GetBytes(buff);

}

@Override

public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {

// Close the connection when an exception is raised.

cause.printStackTrace();

ctx.close();

}

}

回答:

ByteBuf buf = ...

byte[] bytes = new byte[buf.readableBytes()];

buf.readBytes(bytes);

如果您不想更改readerIndex:

ByteBuf buf = ...

byte[] bytes = new byte[buf.readableBytes()];

int readerIndex = buf.readerIndex();

buf.getBytes(readerIndex, bytes);

如果要最小化内存副本,可以使用的支持数组(ByteBuf如果有):

ByteBuf buf = ...

byte[] bytes;

int offset;

int length = buf.readableBytes();

if (buf.hasArray()) {

bytes = buf.array();

offset = buf.arrayOffset();

} else {

bytes = new byte[length];

buf.getBytes(buf.readerIndex(), bytes);

offset = 0;

}

请注意,您不能简单地使用buf.array(),因为:

  • 并非所有人ByteBuf都有支持数组。一些是堆外缓冲区(即直接内存)
  • 即使a ByteBuf具有支持数组(即buf.hasArray()return true),也不一定要满足以下条件,因为该缓冲区可能是其他缓冲区或池化缓冲区的一部分:

    • buf.array()[0] == buf.getByte(0)
    • buf.array().length == buf.capacity()

以上是 Netty Java从ByteBuf获取数据 的全部内容, 来源链接: utcz.com/qa/433564.html

回到顶部