Java基础知识强化之IO流笔记55:IO流练习之 自定义类模拟LineNumberReader的获取行号功能案例
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 }
运行效果,如下: