CharBuffer是Java NIO中用于高效处理字符数据的核心类,通过allocate、wrap等方法创建实例,支持put、get、flip、mark、reset等操作实现灵活的读写控制,并可与Charset、Channel结合完成编码转换和I/O操作,适用于文件、网络等场景下的高性能字符处理。

在Java中,CharBuffer 是 java.nio 包中的核心类之一,用于高效地处理字符数据。它属于NIO(New I/O)框架的一部分,适用于需要直接操作字符缓冲区的场景,比如文件读写、网络通信或字符编解码等。相比传统的字符串拼接或字符数组操作,CharBuffer 提供了更灵活和性能更高的方式来管理字符序列。
创建 CharBuffer 实例
CharBuffer 不能直接通过 new 创建,而是通过静态工厂方法或分配方式获取实例:
- CharBuffer.allocate(int capacity):分配指定容量的缓冲区,底层使用堆内存。
- CharBuffer.wrap(char[] array):将现有字符数组包装成 CharBuffer,修改会影响原数组。
- CharBuffer.wrap(String str):将字符串包装为只读的 CharBuffer。
char[] chars = {'h', 'e', 'l', 'l', 'o'};
CharBuffer buffer = CharBuffer.wrap(chars); // 包装数组
CharBuffer readOnly = CharBuffer.wrap("Hello"); // 只读缓冲区
CharBuffer direct = CharBuffer.allocate(1024); // 分配可写缓冲区
基本操作:put 与 get
CharBuffer 支持从当前位置进行读写操作,位置指针会自动递增:
- buffer.put('a'):向当前位置写入一个字符,并移动 position。
- buffer.get():读取当前位置字符,position 加一。
- 支持批量操作:put(char[]) 和 get(char[])。
注意调用 flip() 切换读写模式。写完数据后必须 flip 才能正确读取。
立即学习“Java免费学习笔记(深入)”;
常见流程:
CharBuffer buf = CharBuffer.allocate(10);
buf.put('J').put('a').put('v').put('a');
buf.flip(); // 准备读取
while (buf.hasRemaining()) {
System.out.print(buf.get()); // 输出: Java
}
标记与重置:mark() 和 reset()
CharBuffer 支持 mark/reset 机制,便于回退到某个已知位置:
- mark():在当前位置打标记。
- reset():将 position 重置到 mark 的位置。
- 若未设置 mark,调用 reset 会抛出 InvalidMarkException。
这个功能在解析文本时特别有用,比如尝试某种解析规则失败后可以回退重新处理。
与其他 NIO 组件配合使用
CharBuffer 常与 Charset、Channel 配合完成编码转换或I/O操作:
- 使用 Charset.encode() 将字符串转为 ByteBuffer。
- 使用 Charset.decode() 将 ByteBuffer 解码为 CharBuffer。
- 在 FileChannel 或 SocketChannel 中读写字符数据时,通常需经过字节与字符的转换。
Charset utf8 = Charset.forName("UTF-8");
ByteBuffer bytes = ByteBuffer.wrap("你好".getBytes("UTF-8"));
CharBuffer chars = utf8.decode(bytes); // 转为 CharBuffer
System.out.println(chars.toString()); // 输出: 你好
基本上就这些。CharBuffer 的优势在于对字符数据的精细控制和高性能处理能力,尤其适合需要手动管理缓冲区的场景。熟练掌握其 position、limit、capacity 和模式切换机制,能有效避免常见错误。










