Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何合并2个ByteBufs?_Java_Netty - Fatal编程技术网

Java 如何合并2个ByteBufs?

Java 如何合并2个ByteBufs?,java,netty,Java,Netty,我正在尝试将2个ByteBuf合并为一个ByteBuf,我如何才能做到这一点 import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import org.apache.commons.lang3.ArrayUtils; import java.util.Arrays; public class Main { public static void main(String[] args) { B

我正在尝试将2个ByteBuf合并为一个ByteBuf,我如何才能做到这一点

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import org.apache.commons.lang3.ArrayUtils;

import java.util.Arrays;

public class Main {

    public static void main(String[] args) {
        ByteBuf a = Unpooled.buffer(4).writeByte(33).writeByte(44).writeByte(55).writeByte(66);
        ByteBuf b = Unpooled.buffer(4).writeByte(77).writeByte(88).writeByte(99).writeByte(22);

        byte[] byteArray = new byte[4];
        a.readBytes(byteArray);

        System.out.println(Arrays.toString(ArrayUtils.addAll(byteArray, b.array())));
        System.out.println(Arrays.toString(
                Unpooled.copiedBuffer(a, b).array()
        ));
    }
}
上面的代码打印出来

[33,44,55,66,77,88,99,22]

[77,88,99,22]


我可以很容易地合并字节数组,但我不能合并ByteBufs,我不能调用ByteBuf.array()方法,也不能在生产环境中用合并的字节数组创建一个新的ByteBuf(当我调用
array()
so时,我得到
UnsupportedOperationException:direct buffer
)发生这种情况是因为您的代码已经读取了
a
的所有四个字节:

a.readBytes(byteArray);
此时,
一个
的读取索引已经超过了数据的末尾,因此没有任何字节被复制

在读取之前放置用于复制缓冲区的代码修复了该问题:

System.out.println(Arrays.toString(
        Unpooled.copiedBuffer(a, b).array()
));
byte[] byteArray = new byte[4];
a.readBytes(byteArray);
System.out.println(Arrays.toString(ArrayUtils.addAll(byteArray, b.array())));
或者,您可以在
readBytes
之后调用
a.resetReaderIndex()
,将缓冲区“倒带”回开头