黑马程序员技术交流社区

标题: 自己写的一个带行号输出的字符流缓冲区(装饰设计模式) [打印本页]

作者: 更上一层    时间: 2014-9-28 11:14
标题: 自己写的一个带行号输出的字符流缓冲区(装饰设计模式)
各位如果觉得好的话,请施舍一点辛苦分给我,谢谢
  1. package cn.itcast.ruxue;

  2. import java.io.BufferedReader;
  3. import java.io.FileNotFoundException;
  4. import java.io.FileReader;
  5. import java.io.IOException;
  6. import java.io.Reader;

  7. /*
  8. *
  9. * 6、 自定义字符输入流的包装类,通过这个包装类对底层字符输入流进行包装,让程序通过这个包装类读取某个文本文件(例如,一个java源文件)时,能够在读取的每行前面都加上有行号和冒号。
  10. *
  11. * */

  12. public class Test6 {
  13.        
  14.         public static void main(String[] args) throws IOException {
  15.                
  16.                 FileReader f = new FileReader("C:\\Users\\lenovo\\Desktop\\Test5.java");
  17.                 MyReader mr = new MyReader(f);
  18.                 String line = null;
  19.                 while((line=mr.MyReadLineWithLineNumber())!=null){
  20.                         System.out.println(line);
  21.                 }
  22.                 mr.close();
  23.         }

  24. }


  25. class MyReader extends Reader{
  26.        
  27.         //底层字符输入流
  28.         private Reader reader;
  29.         //自定义流中的缓冲区
  30.         private char[] buffer = new char[1024];
  31.         //记住缓冲区中剩下的字符数
  32.         private int count = 0;
  33.         //记住当前读到字符的缓冲区角标
  34.         private int pos = 0;
  35.         //记住行号
  36.         private int lineNumber = 1;
  37.        
  38.         public MyReader(Reader reader){
  39.                 this.reader = reader;
  40.         }
  41.        
  42.         //自定义的从缓存区读取单个字符的方法
  43.         public int MyRead() throws IOException{
  44.                 if(count==0){
  45.                         count = reader.read(buffer);
  46.                         pos = 0;
  47.                         if(count<0){
  48.                                 return -1;
  49.                         }
  50.                 }
  51.                 char ch = buffer[pos];
  52.                 count--;
  53.                 pos++;
  54.                 return ch;
  55.         }
  56.        
  57.         //在缓存区读取一行的方法
  58.         public String MyReadLineWithLineNumber() throws IOException{
  59.                 StringBuffer sb = new StringBuffer();
  60.                 int ch = 0;
  61.                
  62.                 while((ch=MyRead())!=-1){
  63.                         if(ch=='\r'){
  64.                                 continue;
  65.                         }
  66.                         if(ch=='\n'){
  67.                                 return (lineNumber++) +"  :::::  "+sb.toString();
  68.                         }
  69.                         sb.append((char)ch);
  70.                 }
  71.                 if(sb.length()>0){
  72.                         return (lineNumber++) +"  :::::  "+sb.toString();
  73.                 }
  74.                 return null;
  75.         }
  76.        
  77.         //关闭流的方法
  78.         public void close() throws IOException{
  79.                 reader.close();
  80.         }

  81.        
  82.         public int read(char[] cbuf, int off, int len) throws IOException {
  83.                 // TODO Auto-generated method stub
  84.                 return 0;
  85.         }
  86. }
复制代码








欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2