java中统计文本文件行数与字数推荐用bufferedreader按行读取并累加长度,兼顾效率、内存安全与换行符兼容性;也可用files.lines()流式处理,但需注意编码与资源关闭。

Java 中快速统计文本文件的总行数与字数,核心是避免逐字符读取或一次性加载大文件到内存,推荐用 BufferedReader 按行读取(统计行数)+ 累加每行长度(统计字数),兼顾效率与通用性。
用 BufferedReader 一行一读,边读边计数
这是最常用、平衡性能与可读性的做法。对任意大小的文本文件都安全,内存占用低,且能准确处理 Windows(\r\n)、Unix(\n)、Mac(\r)等换行符 —— 因为 readLine() 自动识别并剥离换行符,你只需对返回的字符串长度求和即可。
示例代码:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
import java.io.*;
public class FileCounter {
public static void main(String[] args) throws IOException {
String path = "example.txt";
int lines = 0;
long chars = 0; // 用 long 防止超大文件溢出
try (BufferedReader br = new BufferedReader(new FileReader(path))) {
String line;
while ((line = br.readLine()) != null) {
lines++;
chars += line.length(); // 不含换行符
// 若需包含换行符字数,可改为 chars += line.length() + 1;
}
}
System.out.println("行数: " + lines);
System.out.println("字符数(不含换行符): " + chars);
}
}
用 Files.lines()(Java 8+)流式处理,更简洁
适合喜欢函数式风格的场景,底层仍基于高效缓冲读取,代码更短,但要注意:它默认使用 UTF-8 编码,若文件是 GBK、ISO-8859-1 等需显式指定 Charset;且流未关闭时资源不会释放,务必用 try-with-resources 或及时 close。
- 统计行数:直接用
count() - 统计字数:用
mapToInt(String::length).sum()
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.stream.Stream;
public class StreamCounter {
public static void main(String[] args) throws IOException {
String path = "example.txt";
long lines = 0;
long chars = 0;
try (Stream<string> stream = Files.lines(Paths.get(path), StandardCharsets.UTF_8)) {
lines = stream.count(); // 注意:count() 后 stream 已关闭,不能再复用
}
try (Stream<string> stream = Files.lines(Paths.get(path), StandardCharsets.UTF_8)) {
chars = stream.mapToLong(String::length).sum();
}
System.out.println("行数: " + lines);
System.out.println("字符数: " + chars);
}
}</string></string>
注意编码与“字数”的定义
Java 中 String.length() 返回的是 Unicode 代码单元数(即 char 数),对大部分中文、英文、数字都等于“可见字符数”。但遇到增补字符(如某些 emoji:"\uD83D\uDE00" 占 2 个 char),实际是一个字符却算作两个。若需精确的 Unicode 字符数(code point),应改用 line.codePointCount(0, line.length())。
- 普通统计(推荐):用
line.length() - 严格 Unicode 字符数:用
line.codePointCount(0, line.length()) - 字节数(非字数):需按指定编码转 byte[] 后取 length,例如
line.getBytes(StandardCharsets.UTF_8).length
超大文件或追求极致性能?考虑 NIO 的 FileChannel + ByteBuffer
对 GB 级纯 ASCII 或固定编码日志,可跳过字符串解码,直接扫描字节流中的换行符(\n 或 \r\n)。但这会显著增加复杂度,且难以正确处理多字节编码(如 UTF-8 中文),一般项目不建议。除非有明确性能瓶颈且文件格式可控,否则优先选前两种方式。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










