说明
使用Netty的ByteBuf,空间不够时可以自动扩充。扩充时,不是一个字节一个字节的扩充,而是扩充一段空间。对于不同的ByteBufAllocator实现,每次扩充的空间大小也不相同。
代码举例
使用Unpooled分配ByteBuf
下面这段代码,使用Unpooled来分配ByteBuf,但底层使用的是UnpooledByteBufAllocator实现来分配ByteBuf。初始化的时候设置ByteBuf的容量为5个字节,在填充时,填充了6个字节的内容,导致ByteBuf自动扩充空间:
package com.thb;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufAllocator;
import io.netty.buffer.Unpooled;
public class Test {
public static void main(String[] args) {
ByteBuf buf = Unpooled.buffer(5);
//ByteBuf buf = ByteBufAllocator.DEFAULT.buffer(5);
System.out.println("the actual ButeBuf allocator: " + buf.alloc());
System.out.println("ByteBuf's initial capcacity: " + buf.capacity());
for (int i = 0; i < 6; i++) {
buf.writeByte(0x68);
}
System.out.println("after expanding, ByteBuf's capacity: " + buf.capacity());
}
}
运行输出:
从上面的输出可以发现,底层调用的是UnpooledByteBufAllocator(directByDefault: true)来分配ByteBuf,尽管只填充了6个字节的内容,但因为空间不够,自动扩充到了64个字节的空间。
使用ByteBufAllocator.DEFAULT来分配ByteBuf
下面这段代码,使用ByteBufAllocator.DEFAULT来分配ByteBuf,但底层使用的是PooledByteBufAllocator(directByDefault: true)实现来分配ByteBuf。初始化的时候设置ByteBuf的容量为5个字节,在填充时,填充了6个字节的内容,导致ByteBuf自动扩充空间:
package com.thb;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufAllocator;
import io.netty.buffer.Unpooled;
public class Test {
public static void main(String[] args) {
//ByteBuf buf = Unpooled.buffer(5);
ByteBuf buf = ByteBufAllocator.DEFAULT.buffer(5);
System.out.println("the actual ButeBuf allocator: " + buf.alloc());
System.out.println("ByteBuf's initial capcacity: " + buf.capacity());
for (int i = 0; i < 6; i++) {
buf.writeByte(0x68);
}
System.out.println("after expanding, ByteBuf's capacity: " + buf.capacity());
}
}
运行输出:
从上面的输出可以发现,底层调用的是PooledByteBufAllocator(directByDefault: true)来分配ByteBuf,尽管只填充了6个字节的内容,但因为空间不够,自动扩充到了16个字节的空间。