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())
                    
                
                
            
        
浙公网安备 33010602011771号