调用 bytebuffer 的 putchar() 方法可以将一个 char 类型的数据写入缓冲区,该方法会自动处理字节序(默认使用大端序)并更新位置指针。使用时需确保缓冲区剩余容量至少为 2 个字节,否则将抛出 bufferoverflowexception;若需指定字节序,应使用 order(byteorder) 设置后调用 putchar()。

putChar() 在直接缓冲区和堆缓冲区中的行为差异是什么
两种缓冲区均支持 putChar(),但直接缓冲区(Direct Buffer)通常用于与本地 I/O 交互,其内存位于堆外,而堆缓冲区(Heap Buffer)位于 JVM 堆内。两者在写入时的核心逻辑一致:将 char 拆分为两个字节按顺序写入,并移动 position 指针。区别在于内存分配方式和访问速度,直接缓冲区适合频繁的大数据量传输,堆缓冲区适合常规数据处理。

import java.nio.ByteBuffer;
import java.nio.ByteOrder;
public class CharPutDemo {
public static void main(String[] args) {
// 创建堆缓冲区,容量为 4 字节
ByteBuffer heapBuf = ByteBuffer.allocate(4);
char c1 = 'A'; // ASCII 65, 二进制 01000001
heapBuf.putChar(c1);
System.out.println("Heap Buffer position: " + heapBuf.position());
// 创建直接缓冲区,容量为 4 字节
ByteBuffer directBuf = ByteBuffer.allocateDirect(4);
char c2 = 'B'; // ASCII 66
directBuf.putChar(c2);
System.out.println("Direct Buffer position: " + directBuf.position());
// 验证内容
heapBuf.flip();
System.out.println("Heap content: " + (char)heapBuf.getChar());
directBuf.flip();
System.out.println("Direct content: " + (char)directBuf.getChar());
}
}
预期输出:
Heap Buffer position: 2
Direct Buffer position: 2
Heap content: A
Direct content: B
putChar() 如何处理字节序(Byte Order)
putChar() 默认使用大端序(Big-Endian),即高位字节在前。若需使用小端序(Little-Endian),必须先调用 order(ByteOrder.LITTLE_ENDIAN) 修改缓冲区的字节序属性,再调用 putChar()。字节序决定了 char 的两个字节在内存中的排列顺序,影响后续读取时的解析结果。
立即学习“Java免费学习笔记(深入)”;

import java.nio.ByteBuffer;
import java.nio.ByteOrder;
public class ByteOrderDemo {
public static void main(String[] args) {
ByteBuffer buf = ByteBuffer.allocate(4);
// 默认大端序
buf.putChar('A'); // 0x0041 -> 字节序列: 00 41
System.out.println("Big-Endian bytes: " + String.format("%02X %02X", buf.array()[0], buf.array()[1]));
// 切换为小端序
buf.order(ByteOrder.LITTLE_ENDIAN);
buf.clear();
buf.putChar('A'); // 0x0041 -> 字节序列: 41 00
System.out.println("Little-Endian bytes: " + String.format("%02X %02X", buf.array()[0], buf.array()[1]));
}
}
预期输出:
Big-Endian bytes: 00 41
Little-Endian bytes: 41 00
当缓冲区剩余容量不足 2 字节时 putChar() 会抛出什么异常
若调用 putChar() 时缓冲区的剩余容量(remaining())小于 2,将立即抛出 java.nio.BufferOverflowException。这是 NIO 缓冲区的硬性约束,因为 char 占用 2 字节,无法部分写入。开发者应在写入前通过 hasRemaining(2) 或手动检查 capacity() - position() 来避免此异常。


















