LineNumberReader无setLineNumber方法,行号从1开始、仅遇换行符自增;getLineNumber()返回下一行号,新建实例或手动计数是重置行号的合理方式。

LineNumberReader 本身不提供直接设置行号的公开方法,但能准确获取当前已读取内容的行号。它的行号从 1 开始计数,且只对换行符(\n、\r、\r\n)敏感,每遇到一个有效换行符就自动加 1。
如何获取当前行号
调用 getLineNumber() 方法即可返回当前已处理的行号(即下一行将被读取时的行号)。注意:该值反映的是已跳过换行符后的行号,不是“正在读的这一行”的编号。
- 刚创建 LineNumberReader 时,
getLineNumber()返回 0 - 读完第 1 行(含换行符)后,行号变为 1
- 读完第 2 行后,行号变为 2,以此类推
为什么不能直接设置行号
LineNumberReader 没有 setLineNumber(int) 这样的公共方法。其内部行号由私有字段 lineno 维护,仅在 read()、readLine() 等读取操作中自动更新。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 试图通过反射修改
lineno属于非标准做法,破坏封装性,且不同 JDK 版本可能失效 - 重置行号的合理方式是:新建一个
LineNumberReader实例,或在构造前对底层 Reader 做好定位
手动“重置”行号的实用做法
若需从某处重新开始计数(比如跳过头部注释后让行号从 1 起算),可:
立即学习“Java免费学习笔记(深入)”;
- 关闭当前 reader,用同一输入源新建一个
LineNumberReader - 或使用
reset()(前提是底层 Reader 支持 mark/reset,且已调用过mark()) - 更稳妥的方式:自己维护一个独立的行号计数器,在每次成功读取一行后手动递增
注意换行符识别细节
LineNumberReader 对换行符的识别依赖底层 Reader 的实际读取结果:
- 如果某行末尾没有换行符(如文件最后一行),
readLine()仍会返回该行内容,但不会触发行号自增 - 连续两个
\r\n不会误判为两行;\r后紧跟\n被视为一个换行符 - 单个
\r或单个\n都算作一次换行,各自使行号 +1

















