在类Unpooled中提供给了多个名为wrappedBuffer()的帮助方法,用来创建包装给定数据的ByteBuf对象.

包装单个byte数组

代码实现:

public static ByteBuf wrappedBuffer(byte[] array) {
    if (array.length == 0) {
        return EMPTY_BUFFER;
    }
    return new UnpooledHeapByteBuf(ALLOC, array, array.length);
}

结论: byte[]被包装成一个UnpooledHeapByteBuf对象.

包装多个byte数组

代码实现:

public static ByteBuf wrappedBuffer(int maxNumComponents, byte[]... arrays) {
    switch (arrays.length) {
    case 0:
        //如果长度为0,返回EMPTY_BUFFER
        break;
    case 1:
        if (arrays[0].length != 0) {
            //长度为1, 调用回wrappedBuffer(byte[])
            return wrappedBuffer(arrays[0]);
        }
        break;
    default:
        // Get the list of the component, while guessing the byte order.
        final List<ByteBuf> components = new ArrayList<ByteBuf>(arrays.length);
        for (byte[] a: arrays) {        // 游历数组,如果为null或空就跳过
            if (a == null) {
                break;
            }
            if (a.length > 0) {
                // 有效的数据就通过调用wrappedBuffer(byte[]包装为一个ByteBuf
                components.add(wrappedBuffer(a));
            }
        }

        if (!components.isEmpty()) {
            //将多个ByteBuf包装为1个CompositeByteBuf
            return new CompositeByteBuf(ALLOC, false, maxNumComponents, components);
        }
    }

    return EMPTY_BUFFER;
}

结论: 多个byte[]被包装成多个UnpooledHeapByteBuf对象,最后再包装进一个CompositeByteBuf.

包装单个ByteBuf

代码实现:

public static ByteBuf wrappedBuffer(ByteBuf buffer) {
    if (buffer.isReadable()) {
        // 有可读数据, 调用buffer.slice()将可读数据包装为一个ByteBuf
        return buffer.slice();
    } else {
        // 如果没有可读数据,返回EMPTY_BUFFER
        return EMPTY_BUFFER;
    }
}

结论: 多个ByteBuf对象(的可读内容)被包装进一个CompositeByteBuf.

包装多个ByteBuf

代码实现:

public static ByteBuf wrappedBuffer(int maxNumComponents, ByteBuf... buffers) {
    switch (buffers.length) {
    case 0:
        //如果长度为0,返回EMPTY_BUFFER
        break;
    case 1:
        if (buffers[0].isReadable()) {
            //长度为1并且有可读数据, 调用回wrappedBuffer(ByteBuf)
            // TBD: 不清楚为什么这里需要调用 order(BIG_ENDIAN)?
            return wrappedBuffer(buffers[0].order(BIG_ENDIAN));
        }
        break;
    default:
        // 注意这里的判断: 只要有一个ByteBuf有可读数据,就包装为CompositeByteBuf
        for (ByteBuf b: buffers) {
            if (b.isReadable()) {
                //将多个ByteBuf包装为1个CompositeByteBuf
                return new CompositeByteBuf(ALLOC, false, maxNumComponents, buffers);
            }
        }
    }
    return EMPTY_BUFFER;
}

结论: 多个ByteBuf对象(的可读内容)被包装进一个CompositeByteBuf.

results matching ""

    No results matching ""