1 

功能介绍

跟踪行号的缓冲字符输入流。此类定义了方法 setLineNumber(int) 和 getLineNumber(),它们可分别用于设置和获取当前行号。
默认情况下,行编号从 0 开始。该行号随数据读取在每个 行结束符 处递增,并且可以通过调用 setLineNumber(int) 更改行号。但是,setLineNumber(int) 不会实际更改流中的当前位置;它只更改将由 getLineNumber() 返回的值
有的朋友可能觉得,这也叫装饰器模式么?


还是那句话,设计模式是作为解决问题或者设计类层级结构时的一种思维的存在,而不是公式一样的存在!Java IO | LineNumberReader(二十四)_java

 2 

构造方法

LineNumberReader 继承了BufferedReader,构造方法跟BufferedReader 一样。
内部也是直接super
 3 

其他方法

read以及readLine方法
仔细看下两个版本的read方法以及 readLine方法,他们都是super.XXX,然后在此基础上提供了行号的功能。

//读取单个字符int read()
//将字符读入数组中的某一部分int read(char[] cbuf, int off, int len)
//读取文本行readLine()
          BufferedReader是支持标记的,所以LineNumberReader也是自动支持了。
内部借助的也是super.XXX。
也例行提供了skip
里面的read 是super.read.....

 4 

总结

LineNumberReader本身并没有太多的东西,他是BufferedReader的子类。他的逻辑意义,非常典型简单的装饰器模式。是你还有你,一切拜托你,然后自己增加了点小功能。
构造调用父类构造方法,里面的方法也都是借助于super.XXX,只不过增加了行号的功能。


一定要记住,setLineNumber(int) 并不会改变流,只是改变内部的那个    private int lineNumber = 0;

https://mp.weixin.qq.com/s/MsvLh5vFTB1cBc9xri2r8A