Java基础知识强化之IO流笔记55:IO流练习之 自定义类模拟LineNumberReader的获取行号功能案例

时间:2022-01-09 21:34:07

1. 自定义类模拟LineNumberReader的获取行号功能案例

 

2. 代码实现:

(1)MyBufferedReader.java:

 1 package cn.itcast_08;  2 
 3 import java.io.IOException;  4 import java.io.Reader;  5 
 6 /*
 7  * 用Reader模拟BufferedReader的readLine()功能  8  *  9  * readLine():一次读取一行,根据换行符判断是否结束,只返回内容,不返回换行符 10  */
11 public class MyBufferedReader { 12     private Reader r; 13 
14     public MyBufferedReader(Reader r) { 15         this.r = r; 16  } 17 
18     /*
19  * 思考:写一个方法,返回值是一个字符串。 20      */
21     public String readLine() throws IOException { 22         /*
23  * 我要返回一个字符串,我该怎么办呢? 我们必须去看看r对象能够读取什么东西呢? 两个读取方法,一次读取一个字符或者一次读取一个字符数组 24  * 那么,我们要返回一个字符串,用哪个方法比较好呢? 我们很容易想到字符数组比较好,但是问题来了,就是这个数组的长度是多长呢? 25  * 根本就没有办法定义数组的长度,你定义多长都不合适。 所以,只能选择一次读取一个字符。 26  * 但是呢,这种方式的时候,我们再读取下一个字符的时候,上一个字符就丢失了 所以,我们又应该定义一个临时存储空间把读取过的字符给存储起来。 27  * 这个用谁比较和是呢?数组,集合,字符串缓冲区三个可供选择。 28  * 经过简单的分析,最终选择使用字符串缓冲区对象。并且使用的是StringBuilder 29          */
30         StringBuilder sb = new StringBuilder(); 31 
32         // 做这个读取最麻烦的是判断结束,但是在结束之前应该是一直读取,直到-1
33         
34         
35         /*
36  hello 37  world 38  java 39         
40  104101108108111 41  119111114108100 42  1069711897 43          */
44         
45         int ch = 0; 46         while ((ch = r.read()) != -1) { //104,101,108,108,111
47             if (ch == '\r') { 48                 continue; 49  } 50 
51             if (ch == '\n') { 52                 return sb.toString(); //hello
53             } else { 54                 sb.append((char)ch); //hello
55  } 56  } 57 
58         // 为了防止数据丢失,判断sb的长度不能大于0
59         if (sb.length() > 0) { 60             return sb.toString(); 61  } 62 
63         return null; 64  } 65 
66     /*
67  * 先写一个关闭方法 68      */
69     public void close() throws IOException { 70         this.r.close(); 71  } 72 }

 

(2)MyLineNumberReader2.java:

 1 package cn.itcast_09;  2 
 3 import java.io.IOException;  4 import java.io.Reader;  5 
 6 import cn.itcast_08.MyBufferedReader;  7 
 8 public class MyLineNumberReader2 extends MyBufferedReader {  9     private Reader r; 10 
11     private int lineNumber = 0; 12 
13     public MyLineNumberReader2(Reader r) { 14         super(r); 15  } 16 
17     public int getLineNumber() { 18         return lineNumber; 19  } 20 
21     public void setLineNumber(int lineNumber) { 22         this.lineNumber = lineNumber; 23  } 24 
25  @Override 26     public String readLine() throws IOException { 27         lineNumber++; 28         return super.readLine(); 29  } 30 }

 

(3)测试类MyLineNumberReaderTest,如下:

 1 package cn.itcast_09;  2 
 3 import java.io.FileReader;  4 import java.io.IOException;  5 
 6 public class MyLineNumberReaderTest {  7     public static void main(String[] args) throws IOException {  8         // MyLineNumberReader mlnr = new MyLineNumberReader(new FileReader(  9         // "my.txt"));
10 
11         MyLineNumberReader2 mlnr = new MyLineNumberReader2(new FileReader( 12                 "my.txt")); 13 
14         // mlnr.setLineNumber(10); 15 
16         // System.out.println(mlnr.getLineNumber()); 17         // System.out.println(mlnr.getLineNumber()); 18         // System.out.println(mlnr.getLineNumber());
19 
20         String line = null; 21         while ((line = mlnr.readLine()) != null) { 22             System.out.println(mlnr.getLineNumber() + ":" + line); 23  } 24 
25  mlnr.close(); 26  } 27 }

运行效果,如下:

Java基础知识强化之IO流笔记55:IO流练习之 自定义类模拟LineNumberReader的获取行号功能案例