Unpooled.buffer()和Unpooled.copiedBuffer区别

// 创建默认大小的堆缓冲区(初始256字节,最大Integer.MAX_VALUE)
ByteBuf heapBuffer = Unpooled.buffer();

// 创建指定容量的堆缓冲区
public static ByteBuf buffer(int initialCapacity);

// 创建指定大小的堆缓冲区
ByteBuf sizedHeapBuffer = Unpooled.buffer(1024);

// 创建直接内存缓冲区
ByteBuf directBuffer = Unpooled.directBuffer();

------------------------------------------------------

// 从字节数组创建(深拷贝)
public static ByteBuf copiedBuffer(byte[] array);

// 从字符串创建(指定字符集)
public static ByteBuf copiedBuffer(CharSequence string, Charset charset);

// 从现有数据创建
ByteBuf copiedBuffer = Unpooled.copiedBuffer("Hello", CharsetUtil.UTF_8);
ByteBuf buf2 = Unpooled.copiedBuffer(new byte[]{1, 2, 3});

// 包装现有字节数组
byte[] bytes = new byte[128];
ByteBuf wrappedBuffer = Unpooled.wrappedBuffer(bytes);

 

 

特性Unpooled.buffer()Unpooled.copiedBuffer()
缓冲区初始化 创建空缓冲区(内容未初始化) 创建包含指定数据的缓冲区(深拷贝)
内存来源 新分配的空白内存区域 新分配内存并拷贝传入数据
数据所有权 后续由用户写入数据 立即拥有数据的独立副本
典型用途 需要逐步写入数据的场景 快速包装现有数据的场景
线程安全性 非线程安全 非线程安全(但初始数据独立)

 

 

方法数据来源是否拷贝可变性
buffer() - 可变
copiedBuffer() 外部数据 可变
wrappedBuffer() 外部数据 不可变
directBuffer() - 可变

 

 

firstMessage = Unpooled.buffer(req.length);
firstMessage.writeBytes(req);

等同如下效果

firstMessage =  Unpooled.copiedBuffer("QUERY TIME ORDER".getBytes())
posted @ 2025-05-14 17:09  三驾马车  阅读(61)  评论(0)    收藏  举报