1 package com.itheima;
2
3 import java.io.FileReader;
4 import java.io.IOException;
5 import java.io.Reader;
6
7 public class Test06 {
8
9 /**
10 * 需求:
11 * 自定义字符输入流的包装类,通过这个包装类对底层字符输入流进行包装,
12 * 让程序通过这个包装类读取某个文本文件(例如,一个java源文件)时,
13 * 能够在读取的每行前面都加上有行号和冒号
14 * @param args
15 */
16 public static void main(String[] args) throws IOException
17 {
18 //创建流对象并关联文件
19 FileReader fr = new FileReader("Test01.java");
20 //对流进行包装
21 MyLineNumberReader mylnr = new MyLineNumberReader(fr);
22
23 String line = null;
24 //读取一行记录一行
25 while((line=mylnr.myReadLine())!=null)
26 {
27 System.out.println(mylnr.getLineNumber()+":"+line);
28 }
29 //关流
30 mylnr.myClose();
31 }
32 }
33
34
35 class MyLineNumberReader
36 {
37 //定义流对象
38 private Reader r;
39 private int lineNum;
40 //传入被装饰对象
41 MyLineNumberReader(Reader r)
42 {
43 this.r = r;
44 }
45 //对外提供方法
46 public String myReadLine()throws IOException
47 {
48 //读取一行就自增一次
49 lineNum++;
50 //自定义缓冲区
51 StringBuilder sb = new StringBuilder();
52
53 int ch = 0;
54 //不为空一直读取
55 while((ch=r.read())!=-1)
56 {
57 if(ch==‘\r‘)//判断标记
58 continue;
59 if(ch==‘\n‘)
60 return sb.toString();
61 else
62 sb.append((char)ch);//将读取到的字符添加到缓冲区
63 }
64 //判断缓冲区是否为空
65 if(sb.length()!=0)
66 return sb.toString();//不为空继续返回里面内容
67 return null;
68 }
69 public void setLineNumber(int lineNum)
70 {
71 this.lineNum = lineNum;
72 }
73 public int getLineNumber()
74 {
75 return lineNum;
76 }
77 //对外提供关闭流的方法
78 public void myClose()throws IOException
79 {
80 r.close();
81 }
82 }
83