程序员潇然 发表于 2022-8-26 15:58:30

JavaIO之LineNumberReader(二十三)

### 功能介绍

LineNumberReader是提供了行号的具体的装饰器类

跟踪行号的缓冲字符输入流
此类定义了方法 setLineNumber(int) 和 getLineNumber(),它们可分别用于设置和获取当前行号

默认情况下,行编号从 0 开始
该行号随数据读取在每个 行结束符 处递增,并且可以通过调用 setLineNumber(int) 更改行号

`本文作者:程序员潇然 疯狂的字节X https://crazybytex.com/`
但是,setLineNumber(int) 不会实际更改流中的当前位置;
它只更改将由 getLineNumber() 返回的值

有的朋友可能觉得,这也叫装饰器模式么?
还是那句话

> 设计模式是作为解决问题或者设计类层级结构时的一种思维的存在,而不是公式一样的存在!

!(data/attachment/forum/202208/26/155346zu4ykkqtykhckry2.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")

### 构造方法

LineNumberReader 继承了BufferedReader
构造方法跟BufferedReader 一样
内部也是直接super
!(data/attachment/forum/202208/26/155403oamafbmfewfdll5a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")

### 其他方法

#### read以及readLine方法

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

```java
//读取单个字符
int read();

//将字符读入数组中的某一部分
int read(char[] cbuf, int off, int len);

//读取文本行
readLine();
```

!(data/attachment/forum/202208/26/155641x22bi8ruu9ou4i9b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")

#### 标记

BufferedReader是支持标记的
所以LineNumberReader也是自动支持了
内部借助的也是super.XXX
!(data/attachment/forum/202208/26/155700ochnybvjnmvbycny.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")

#### skip

也例行提供了skip
里面的read 是super.read.....
!(data/attachment/forum/202208/26/155736vbb72too7h4zudud.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")

### 总结

LineNumberReader本身并没有太多的东西,他是BufferedReader的子类
他的逻辑意义,非常典型简单的装饰器模式

> 是你还有你,一切拜托你

然后自己增加了点小功能

构造调用父类构造方法,里面的方法也都是借助于super.XXX
只不过增加了行号的功能


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

!(data/attachment/forum/202206/16/141330jha7st9soow8772i.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "common_log.png")
`转载务必注明出处:程序员潇然,疯狂的字节X,https://crazybytex.com/thread-159-1-1.html `
页: [1]
查看完整版本: JavaIO之LineNumberReader(二十三)