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
原文:http://www.cnblogs.com/wtyqer/p/3527714.html