You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 04:54:03