Java 如何合并2个ByteBufs?
我正在尝试将2个ByteBuf合并为一个ByteBuf,我如何才能做到这一点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
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()
,将缓冲区“倒带”回开头