java - 如何合并 2 个 ByteBuf?
问题描述
我正在尝试将 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(我UnsupportedOperationException: direct buffer
在调用时得到array()
)
解决方案
发生这种情况是因为您的代码已经读取了所有a
的四个字节:
a.readBytes(byteArray);
此时a
的读取索引已超过数据末尾,因此不会复制任何字节。
在读取之前放置复制缓冲区的代码可以解决问题:
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())));
或者,您可以调用a.resetReaderIndex()
afterreadBytes
将缓冲区“倒回”到开头。
推荐阅读
- python - PDFminer 从每页的标题中获取字体大小(迭代)
- sql - Find value contained in the HierarchyId at any level
- c# - OpenXML reference document parts multiple time
- java - Finding random (auto) id assigned to our document by Firestore
- sql - Adding data to existing table with primary key violates unique constraint despite being unique?
- youtube-api - youtube search change the pages token
- javascript - How i can make invite logger with Discord.js?
- node.js - How can increment a new field in mongoose rather than update entire document?
- git - Undo changes in code (whole project) to a specific commit but Keep all the "git logs" (using git bash)
- python-3.x - 通过 python 获取所有可用函数的列表,本地的、全局的还是导入的?