LineNumberReader 是 Java IO 中专为按行读取文本并自动维护行号的装饰器类,基于 BufferedReader,仅在调用 readLine() 时递增行号;初始行号为 0,可通过 setLineNumber(int) 设置起始值,getLineNumber() 返回上一次 readLine() 所读行的编号。

LineNumberReader 是 Java IO 中专为按行读取文本并自动维护行号而设计的装饰器类,它基于 BufferedReader,在每次调用 readLine() 或跳过换行符时自动递增内部行号计数器。
初始化时设置起始行号
默认情况下,LineNumberReader 从第 0 行开始计数(即第一行读取后行号变为 1)。可通过 setLineNumber(int) 方法手动设定初始值:
- 例如希望首行显示为“第 1 行”,可不干预,默认即可;
- 若需从“第 100 行”开始编号(如跳过文件头),调用
reader.setLineNumber(99)(因为下一次readLine()会使行号 +1); - 注意:该方法只影响后续读取,对已读取的行无效。
读取过程中获取当前行号
调用 getLineNumber() 可随时获取**当前已成功读取的行所对应的行号**(即上一次 readLine() 返回的那行的编号):
- 首次调用
readLine()后,getLineNumber()返回 1; - 如果某次
readLine()返回null(表示流末尾),行号仍保持为最后一行的编号; - 若尚未调用过
readLine(),初始值为 0。
注意换行符处理与行号更新时机
行号仅在以下情况递增:
立即学习“Java免费学习笔记(深入)”;
- 成功执行一次
readLine()(无论是否返回空字符串); - 调用
skip(long)跳过字符时,不会触发行号更新; - 使用
read()或read(char[])逐字节/字符读取,也不会更新行号 —— 这是关键限制,必须用readLine()才能联动行号。
实用示例:带行号的日志式读取
常见用法是边读边打印带编号的内容:
try (LineNumberReader reader = new LineNumberReader(new FileReader("data.txt"))) {
String line;
while ((line = reader.readLine()) != null) {
int currentLine = reader.getLineNumber();
System.out.printf("第 %d 行: %s%n", currentLine, line);
}
}
输出类似:
第 1 行: Hello
第 2 行: World
第 3 行: Java


















