高效读取文件需四步:定编码(用files.newbufferedreader或inputstreamreader指定utf-8)、调缓冲(设64kb减少i/o)、自动关(try-with-resources防泄漏)、不囤字符串(逐行处理,避免list或stringbuilder全量缓存)。

Java 字符串本身不参与读取过程,真正高效读取靠的是 BufferedReader 的流式设计——它每次只把一行内容读进一个字符串对象,用完即弃。关键不是“怎么用字符串”,而是“怎么让 BufferedReader 不把字符串堆起来”。
必须显式指定字符编码,避免字符串乱码
中文、emoji 或跨平台生成的文件,如果依赖默认编码(Windows 是 GBK,Linux/macOS 多为 UTF-8),readLine() 返回的字符串会直接出错。不能写 new FileReader("log.txt"),因为它不接受编码参数。
- Java 11+ 推荐:
Files.newBufferedReader(Paths.get("data.log"), StandardCharsets.UTF_8) - 低版本 Java:
new BufferedReader(new InputStreamReader(new FileInputStream("data.log"), StandardCharsets.UTF_8))
缓冲区设为 64KB,减少系统调用次数
默认 8KB 缓冲在大文件场景下频繁触发磁盘 I/O,拖慢整体速度。64KB(65536 字节)是实测平衡点:既降低调用频次,又不显著增加内存压力。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 构造时传入:
new BufferedReader(reader, 64 * 1024) - 缓冲区只是中间暂存,不影响
readLine()每次只返回一行的本质
用 try-with-resources 自动关闭,防止句柄泄漏
BufferedReader 包装了底层输入流,漏关会导致文件句柄耗尽,尤其在服务端长期运行时。手动 close() 容易遗漏异常路径。
- 正确写法:
try (BufferedReader br = ... ) { ... } - 即使循环中抛出
IOException,br 也会被自动释放
逐行处理、即用即弃,绝不缓存全部字符串
readLine() 返回的字符串只保留当前行,内存占用是 O(行长度),不是 O(文件大小)。溢出只发生在你主动囤积:
- ✅ 立即解析字段、写数据库、输出到新文件、更新统计变量
- ✅ 需上下文?只保留必要状态(如前一行 ID、计数器),不存整行字符串
- ❌ 不要
lines.add(line)到 List,百万行极易 OOM - ❌ 不要用
StringBuilder拼接全文,等于把文件全搬进堆里
不复杂但容易忽略。核心就四件事:定编码、调缓冲、自动关、不囤字符串。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










