Java NIO ByteBuffer调用put方法写入字节数组后额外添加0值问题
问题原因分析
你遇到的现象不是ByteBuffer.put(byte[])方法的缺陷或文档遗漏,是putChar()方法的特性导致的误判:
- Java中
char是16位双字节类型,ByteBuffer.putChar(char c)会按当前缓冲区的字节序(默认是大端序)写入2个字节:高8位、低8位。 - 你写入的
|、=均属于ASCII单字节字符,低8位为字符本身的ASCII编码,高8位固定为0,大端序下高8位在前,所以每次调用putChar()时写入的第一个字节就是0值,刚好跟在你前一步put(byte[])写入的内容之后,就形成了put(byte[])自动追加0的错觉。
修复方案
将写入单字节分隔符的putChar()方法替换为put(byte)即可,同时建议指定字符串转字节的编码,避免依赖系统默认编码出现乱码:
import java.nio.charset.StandardCharsets; public ByteBuffer toByteBuffer() { // 已修正原代码中allocateDirect后多余的右括号笔误 ByteBuffer buffer = ByteBuffer.allocateDirect(1024); buffer.put(type.name().getBytes(StandardCharsets.UTF_8)); data.forEach((key, value) -> { buffer.put((byte)'|'); buffer.put(key.getBytes(StandardCharsets.UTF_8)); buffer.put((byte)'='); buffer.put(value.getBytes(StandardCharsets.UTF_8)); }); buffer.flip(); return buffer; }
额外说明
如果确实需要使用putChar()写入字符,可调整缓冲区的字节序为小端序让0字节后置,但这种方案仅适用于所有字符都是ASCII的场景,远不如直接用put(byte)写入单字节分隔符稳妥。
内容的提问来源于stack exchange,提问作者layereight
相关产品推荐
相关产品推荐

