web-dev-qa-db-fra.com

Netty Java obtention de données de ByteBuf

Comment obtenir un tableau d'octets de ByteBuf efficacement dans le code ci-dessous? J'ai besoin d'obtenir le tableau, puis de le sérialiser.

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

}
25
NiceTheo
ByteBuf buf = ...
byte[] bytes = new byte[buf.readableBytes()];
buf.readBytes(bytes);

Si vous ne voulez pas que le readerIndex change:

ByteBuf buf = ...
byte[] bytes = new byte[buf.readableBytes()];
int readerIndex = buf.readerIndex();
buf.getBytes(readerIndex, bytes);

Si vous souhaitez réduire la copie mémoire, vous pouvez utiliser le tableau de support de ByteBuf, s'il est disponible:

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

Veuillez noter que vous ne pouvez pas simplement utiliser buf.array(), car:

  • Tous les ByteBuf n'ont pas de tableau de sauvegarde. Certains sont des tampons hors tas (c'est-à-dire une mémoire directe)
  • Même si un ByteBuf a un tableau de support (ie buf.hasArray() renvoie true), ce qui suit n'est pas nécessairement vrai car le tampon peut être une tranche d'un autre tampon ou un tampon groupé:
    • buf.array()[0] == buf.getByte(0)
    • buf.array().length == buf.capacity()
74
trustin