推荐用 bufferedreader.readline() 或 files.lines() 统计文件行数:前者兼容性强、内存安全,后者简洁但需注意编码和流关闭;避免 scanner、fileutils.readlines() 等易 oom 或误切行的方法。

Java 中统计文件总行数,核心是避免把整个文件加载进内存,同时准确识别换行符(\r\n、\n、\r),推荐用 BufferedReader.readLine() 或 Files.lines(),两者都自动处理不同平台换行符。
用 BufferedReader 一行一读(最稳、兼容性最强)
适合所有 JDK 版本,内存占用低,对超大文件也安全。readLine() 返回的字符串不含换行符,每调用一次就代表一行。
- 用 try-with-resources 自动关闭资源
- 每读一行,行数 +1;若需字符总数,累加 line.length()
- 空文件或只有换行符的文件,结果也准确
用 Files.lines() 流式统计(代码简洁,JDK 8+)
底层仍用缓冲读取,写法更函数式。但要注意两点:默认按 UTF-8 解码,非 UTF-8 文件要显式传 Charset;流必须关闭,否则可能泄漏文件句柄。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 统计行数:直接调用 count(),返回 long 类型
- 想同时统计字符数,可用 mapToInt(String::length).sum()
- 建议包裹在 try-with-resources 中,或确保流被及时关闭
小文件可考虑 LineNumberReader(快但有局限)
它通过跳过全部内容来定位最后一行号,速度略优于 BufferedReader,但不适用于含超长行(如单行几 MB)或文件大小接近 Long.MAX_VALUE 的场景。
- 调用 skip(Long.MAX_VALUE) 后取 getLineNumber() + 1
- 无法获取字符数,也不方便做内容判断(比如跳过空行或注释)
- 异常情况(如编码错误)容易抛出,健壮性不如前两种
别踩这些坑
用 Scanner 逐行读虽然可行,但默认分隔符可能误切行(尤其含特殊字符时),且性能略低,不推荐用于纯行数统计;用 FileUtils.readLines()(Apache Commons)会一次性加载全部行到内存,大文件易 OOM;直接用 Files.readAllLines() 同理,慎用。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










