bufferedreader 支持通过构造函数指定字符缓冲区大小(单位:字符),默认通常为8192字符;合理设置需匹配数据源特征,如大文本文件推荐16kb–64kb,网络流建议8kb–16kb,内存受限环境可降至4kb。

Java 字符输入流(如 BufferedReader)可以通过构造函数显式指定缓冲区大小,从而适配不同读取场景,减少底层 I/O 调用次数、提升整体效率。关键不在于“越大越好”,而在于匹配数据源特征和使用模式。
明确支持自定义缓冲区的字符输入流类
只有 BufferedReader 支持直接设置缓冲区大小(单位:字符数,不是字节数)。它内部使用 char[] 作为缓冲数组,大小由构造参数决定:
-
BufferedReader(Reader in):使用默认缓冲区(通常为 8192 个字符,即约 8KB 内存,具体取决于 JVM 实现) -
BufferedReader(Reader in, int sz):推荐方式,传入自定义大小,例如new BufferedReader(reader, 16 * 1024)
常见场景下的合理缓冲区大小建议
缓冲区大小需结合数据源类型、读取粒度和内存约束综合判断:
-
读取大文本文件(如日志、CSV)且以行为单位处理:设为 16KB–64KB(即 16384–65536 个字符),可显著降低
readLine()的系统调用频次 - 网络响应流(如 HTTP 响应体)或不确定行长的流:建议 8KB–16KB,兼顾吞吐与延迟,避免初始填充过久
- 内存受限环境(如嵌入式或高并发服务):可降至 4KB(4096 字符),防止大量 BufferedReader 实例堆积内存
- 小配置文件或单次短读取:默认 8KB 已足够,无需调整
实际代码示例与注意事项
正确写法示例:
Reader reader = new FileReader("config.txt");
BufferedReader br = new BufferedReader(reader, 32 * 1024); // 自定义 32KB 缓冲区
String line;
while ((line = br.readLine()) != null) {
process(line);
}
br.close();
注意要点:
- 缓冲区大小是字符数量,不是字节数;UTF-8 中一个中文字符可能占 3 字节,但只计为 1 个
char - 缓冲区在构造时分配,不可动态扩容;若预估过大,会导致单个实例内存浪费
- 必须确保底层
Reader(如FileReader或InputStreamReader)已正确打开,否则抛出异常 - 不要混淆
BufferedInputStream(字节流,单位字节)和BufferedReader(字符流,单位字符)的缓冲逻辑
什么时候不需要手动设置?
以下情况保持默认即可:
- 读取内容总大小远小于 8KB(如几百行配置)
- 使用
read(char[] cbuf, int off, int len)批量读取,且每次len接近默认缓冲区大小 - 项目无明确性能瓶颈,且未通过 JFR 或 profiler 观察到 I/O 等待过高
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











