Netty通过ByteBuf类对数据进行操作,ByteBuf提供了对于字节操作的方法。
对于Netty中ByteBuf对象的字节操作:
ByteBuf的顺序访问:
// 顺序访问ByteBuf中的字节。
public static void getByteFromBuff(){
ByteBuf buff = buf;
for(int i = 0; i < buff.capacity() ; i++){
byte temp = buff.getByte(i);
System.out.println((char)temp);// 一个字符占一个字节。
}
}
ByteBuf读取所有字节:
// 访问ByteBuf中的所有字节
public static void getAllByte(){
ByteBuf buff = buf;
while(buff.isReadable()){
System.out.println((char)buff.readByte());
}
}
通过控制ReadIndex和writeIndex的位置来进行索引管理。
ByteBuf派生缓缓区:
byteBuf提供了提供了呈现ByteBuf视图的方式,主要有slice、duplicate等操作。
public static void duplicateByte(){// 派生缓存,共用一个地址空间。
Charset utf8 = Charset.forName("utf-8");
ByteBuf buff = Unpooled.copiedBuffer("I am a dog" , utf8);
ByteBuf sliceBuff = buff.slice(0 , 10);
sliceBuff.setByte(0, (byte)'y');
System.out.println(buff.toString(utf8));// charset方式
}
对象的池化:将创建的对象保存起来,用来保存对象的容器叫做对象池。Netty提供了生成ByteBuf的对象池Unpooled。
ByteBuf的分配:
按需分配
ByteBufAllocate分配池化的ByteBuf。
/**
* Netty默认使用ByteBufAllocator分配ByteBuf,这样的ByteBuf是池化的bytebuf。
*/
public static void AllocateByte(){
// 从Channel中获取一个ByteBufAllocator
Channel channel = new NioSocketChannel();
ByteBufAllocator byteAllo = channel.alloc();
// 从ChannelHandlerContext中获取一个ByteBufAllocate。
ChannelHandlerContext ctx = DUMMY_INSTANCE;
ctx.alloc();//从channelHandlerContext获取池化的ByteBuf。
}
Unpooled提供静态方法,分配未池化的byteBuf。
ByteBuf提供引用计数的方式对于ByteBuf和ByteBufHolder进行内存回收。