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

}

Ответы

Ответ 1

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() возвращает true), следующее необязательно верно, потому что буфер может быть срезом другого буфера или пула буферов:
    • buf.array()[0] == buf.getByte(0)
    • buf.array().length == buf.capacity()