Java统计文件行数和单词数需逐行读取:行数用Files.lines().count()或BufferedReader手动计数;单词数按空白分割(split("s+"))并过滤空行;须指定编码、处理IO异常,避免用split(" ")或File.length()估算。

在 Java 中统计文件的总行数和单词数,核心思路是逐行读取内容,再对每行进行行计数和单词分割计数。注意“单词”的定义会影响结果(比如是否忽略标点、空格、大小写等),下面给出实用、健壮的实现方式。
一、统计总行数(简单可靠)
使用 Files.lines() 或 BufferedReader 逐行读取,避免一次性加载大文件到内存。
- 推荐用
Files.lines(path).count()—— 简洁且自动处理资源(Java 8+) - 若需兼容老版本或自定义行为(如跳过空行),可用
BufferedReader手动计数
示例:
long lineCount = Files.lines(Paths.get("file.txt")).count();
二、统计总单词数(按空白分隔)
“单词”通常指由空白符(空格、制表符、换行符等)分隔的非空字符串。建议用 String.split("\s+") 或 StringTokenizer,并过滤掉空字符串。
立即学习“Java免费学习笔记(深入)”;
-
split("\s+")能处理多个连续空格、制表符等,返回非空子串数组 - 每行调用
line.trim().isEmpty()可跳过纯空白行,避免误计 0 个单词 - 不建议用
split(" ")—— 它无法处理制表符或多个空格
示例逻辑:
long wordCount = Files.lines(Paths.get("file.txt"))
.map(line -> line.trim().isEmpty() ? 0 : line.trim().split("\s+").length)
.mapToInt(Integer::intValue)
.sum();
三、兼顾性能与健壮性的完整写法
对于大文件或需要复用的场景,推荐用 try-with-resources + BufferedReader,显式控制流并避免潜在异常(如编码、IO 错误)。
- 指定字符编码(如
StandardCharsets.UTF_8),防止乱码导致分词异常 - 捕获
IOException并合理处理(如抛出运行时异常或返回 -1) - 单词统计可进一步增强:用
\w+匹配字母数字序列,忽略标点(如"hello!"→"hello")
简明实现片段:
int lines = 0, words = 0;
try (BufferedReader br = Files.newBufferedReader(Paths.get("file.txt"), StandardCharsets.UTF_8)) {
String line;
while ((line = br.readLine()) != null) {
lines++;
if (!line.trim().isEmpty()) {
words += line.trim().split("\s+").length;
}
}
}
四、注意事项与常见误区
实际使用中容易忽略这些细节:
- 空文件或全空白行会导致行数为 0、单词数为 0 —— 这是符合预期的,无需特殊处理
- 文件末尾有换行符不影响行数统计(
readLine()不会多读一行) - 如果“单词”需满足更严格条件(如仅英文、长度 ≥2、去重统计),应改用正则
Pattern.compile("\b[a-zA-Z]{2,}\b")提取匹配项 - 不要用
File.length()估算行数或单词数 —— 字节数和文本结构无直接关系


















