files.lines() 是 java 8+ 推荐的大文件行数统计方式,基于内存映射与惰性流,支持自动换行符识别、显式编码指定及异常处理,但流不可复用且需用 paths.get() 构造路径。

Files.lines() 是 Java 8+ 中最推荐的方式,它底层基于内存映射和按需读取,不把整个文件加载进堆内存,能有效避免大文件导致的 OOM。
用 Files.lines() 流式统计行数
调用 Files.lines(path).count() 即可获得行数。该方法返回的是惰性 Stream,每行只在需要时解析,且自动按系统换行符(\n、\r\n 等)切分,无需手动处理换行逻辑。注意:count() 是终止操作,流只能使用一次。
注意编码与异常处理
默认使用 UTF-8 编码,若文件是 GBK、ISO-8859-1 等其他编码,必须显式指定:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 用 Files.lines(path, StandardCharsets.GBK) 显式传入 charset
- 务必包裹在 try-catch 中捕获 IOException,尤其在文件不存在或权限不足时
对比其他方式的适用场景
不是所有情况都适合 Files.lines():
- 超大文件(GB 级)且仅需行数:Files.lines() 仍高效;比 BufferedReader 手动循环更简洁,资源自动释放
- 需同时统计字符数或单词数:可用 map + reduce 组合,例如 .map(String::length).reduce(0, Integer::sum) 算总字符(不含换行符)
- 极小文件或已有 BufferedReader 实例:直接用 readLine() 循环更轻量,无 Stream 开销
避坑要点
几个容易忽略但关键的细节:
- 路径必须是 Paths.get("xxx.txt"),不能传字符串字面量给 Files.lines()
- 不要在 count() 后再用同一个 Stream 做 filter 或 map —— 流已关闭
- 若文件末尾无换行符,最后一行仍会被计入,符合 wc -l 行为标准
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










