2013-10-10 79 views
15

如何从ByteBuf有效地获取下面的代码中的字节数组?我需要获取数组然后序列化它。Netty java从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(); 
     } 

} 
+0

你能请张贴的完整代码。还要提到你使用的是哪个版本的netty? –

+0

我使用Netty的4.0.9版本 – NiceTheo

+0

那么问题是什么?在上述背景下,字节量是多少? –

回答

47
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都有后备阵列。一些是堆外缓冲区(即直接内存)
  • 即使ByteBuf有一个支持数组(即buf.hasArray()返回true),以下情况并不一定是真实的,因为缓冲区可能是其他缓冲区或池缓冲区的一部分:
    • buf.array()[0] == buf.getByte(0)
    • buf.array().length == buf.capacity()
+1

[@ user6想知道](http://stackoverflow.com/a/28122795/2778484)如果他能做'byte [] ar = buf.array( )'(如果我正确理解这篇文章)。 – chappjc

+0

更新了他的答案。 – trustin