linenumberreader 行号默认从 0 开始,首次 readline() 后变为 1;需在 readline() 后立即调用 getlinenumber() 获取当前行号,空行也计数;可选 setlinenumber() 重置起始值。

LineNumberReader 是 Java 中用于读取文本文件并自动跟踪行号的工具类,它继承自 BufferedReader,核心优势在于能通过 getLineNumber() 实时获取当前已读取的行号(从 0 开始计数,但默认初始值为 0,首次调用 readLine() 后变为 1)。
初始化 LineNumberReader
需要将一个字符输入流(如 FileReader 或带编码的 InputStreamReader)包装进去。推荐使用带指定编码的方式,避免乱码:
- 使用
FileReader(默认平台编码,不推荐用于跨平台场景) - 更稳妥:用
Files.newBufferedReader(Paths.get("xxx.txt"), StandardCharsets.UTF_8),再包装成LineNumberReader;或直接传入InputStreamReader构造器
行号从 0 还是 1 开始?
构造后,getLineNumber() 返回 0;每成功调用一次 readLine()(返回非 null),行号自动加 1。也就是说:
- 刚创建好还没读任何行 → 行号 = 0
- 读完第 1 行(第一次
readLine()成功)→ 行号 = 1 - 读完第 n 行 → 行号 = n
注意:空行、只有空白字符的行也会被计入行号。
读取时获取当前行号的正确时机
必须在调用 readLine() 之后、处理该行内容 之前 调用 getLineNumber(),否则拿到的是上一行的编号:
String line;
while ((line = reader.readLine()) != null) {
int currentLine = reader.getLineNumber(); // ✅ 正确:此时 line 对应 currentLine
System.out.println("第 " + currentLine + " 行: " + line);
}
如果写成先调 getLineNumber() 再 readLine(),就会错位 —— 比如第一行会显示行号 0。
重置行号(可选)
调用 setLineNumber(int) 可以手动设置起始行号(例如设为 1,让首行显示“第 1 行”更符合直觉)。但注意这不会影响实际读取逻辑,只是改变后续 getLineNumber() 的返回值:
-
reader.setLineNumber(1);后,首次readLine()完成 →getLineNumber()返回 2 - 一般不需要重置,按默认行为(从 0 起始,读一行+1)理解最自然
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











