A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 何小红 中级黑马   /  2012-9-14 00:48  /  2297 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 何小红 于 2012-9-15 19:01 编辑

自定义字符输入流的包装类,通过这个包装类对底层字符输入流进行包装,让程序通过这个包装类读取某个文本文件(例如,一个java源文件)时,能够在读取的每行前面都加上有行号和冒号。
IO始终没有搞得很清楚,所以在论坛里抛出,求解题思路,不胜感激

评分

参与人数 1技术分 +1 收起 理由
创出一片辉煌 + 1 赞一个!

查看全部评分

4 个回复

倒序浏览
  1. import java.io.FileNotFoundException;
  2. import java.io.FileReader;
  3. import java.io.IOException;
  4. import java.io.Reader;

  5. public class Test {

  6.         /**
  7.          * @param args
  8.          * @throws IOException
  9.          */
  10.         public static void main(String[] args) {
  11.                 // TODO Auto-generated method stub
  12.                 //建立MyLineNumberReader对象
  13.                 MyLineNumberReader mylnr = null;
  14.                 try {
  15.                         mylnr = new MyLineNumberReader(new FileReader("F:\\workspace\\exam\\src\\com\\itheima\\Test7.java"));
  16.                         String line = null;
  17.                         while((line=mylnr.myReadLine())!=null){
  18.                                 System.out.println(mylnr.getLineNumber()+":"+line);
  19.                         }
  20.                        
  21.                 } catch (FileNotFoundException e) {
  22.                         // TODO Auto-generated catch block
  23.                         e.printStackTrace();
  24.                 } catch (IOException e) {
  25.                         // TODO Auto-generated catch block
  26.                         e.printStackTrace();
  27.                 } finally{
  28.                         try {
  29.                                 if(mylnr!=null)
  30.                                         mylnr.myClose();
  31.                         } catch (IOException e) {
  32.                                 // TODO Auto-generated catch block
  33.                                 e.printStackTrace();
  34.                         }
  35.                 }
  36.         }

  37. }

  38. //自定义一个字符输入流包装类,带行号
  39. class MyLineNumberReader{
  40.         private Reader r;
  41.         private int lineNumber;
  42.         MyLineNumberReader(Reader r){
  43.                 this.r = r;
  44.         }
  45.        
  46.         public String myReadLine() throws IOException{
  47.                 lineNumber++;
  48.                 //定义一个容器存放数据
  49.                 StringBuilder sb = new StringBuilder();
  50.                 int ch = 0;
  51.                 while((ch=r.read())!=-1){
  52.                         if(ch=='\r')
  53.                                 continue;
  54.                         if(!(ch=='\n'))
  55.                                 sb.append((char)ch);
  56.                         else
  57.                                 return sb.toString();
  58.                 }
  59.                 if(sb.length()!=0)
  60.                         return sb.toString();
  61.                 return null;
  62.         }
  63.        
  64.         //获取行号
  65.         public int getLineNumber() {
  66.                 return lineNumber;
  67.         }

  68.         //设置行号
  69.         public void setLineNumber(int lineNumber) {
  70.                 this.lineNumber = lineNumber;
  71.         }

  72.         //关闭流
  73.         public void myClose() throws IOException{
  74.                 r.close();
  75.         }
  76. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
黑马_许芸 + 1 赞一个!

查看全部评分

回复 使用道具 举报
import  java.io.*;
class MyLineNumberReader
{
       private Reader r;
       int lineNum=0;      
       MyLineNumberReader( Reader r )
       {
              this.r=r;
              lineNum=0;
       }
       public String readLine() throws Exception
       {
              StringBuffer sb=new StringBuffer();
              int num=0;
              while( (num=r.read())!=-1 )
              {
                     if( num=='\r')
                            continue;
                     else if( num=='\n')
                     {
                            lineNum++;
                            return addLineNum( sb.toString() );            
                     }
                     else
                     {
                            sb.append((char)num);
                     }              
              }
              if( sb.length()>0 )
              {
                     return sb.toString();
              }
              return null;
       }
  
       public String addLineNum( String s )
       {
              return lineNum+": "+s;
       }
       public void close() throws Exception
       {
              r.close();
       }
}

class Demo
{
       public static void main(String args[]) throws Exception
       {
              MyLineNumberReader my=new MyLineNumberReader( new FileReader("upLoadTxt.java"));
              String s=null;
              while( (s=my.readLine())!=null )
              {
                     System.out.println( s );
              }
       }
}

回复 使用道具 举报
下面是我写的完整的代码,注释写的应该很详细,仅供参考,希望对你有帮助
import java.io.FileReader;
import java.io.IOException;
//自定义的包装类
public class MyBufferedReader {
        private FileReader r;
        //read()是FileReader类的方法,所以一初始化就让一个流对象进来。
        public MyBufferedReader(FileReader r){
                this.r=r;
        }
        //行号从1开始
        private int num=1;
        //自定义readLine方法,一次读取一行。
        public String myReadLine(){
                //定义一个StringBuilder临时容器,因为最后要把数据变成字符串。
                StringBuilder sb=new StringBuilder();
                int ch=0;
                try {
                        while((ch=r.read())!=-1){
                                //如果是每行的开头,并且不是\r和\n,就在前面加上行号和冒号
                                if(sb.length()==0&&ch!='\r'&&ch!='\n')
                                        System.out.print(num+++":");
                                //如果读到\r,不存到StringBuilder中,继续读.
                                if(ch=='\r')
                                        continue;
                                //如果读到\n,说明读到行结尾,把缓冲区中数据返回。
                                if(ch=='\n')
                                        return sb.toString();
                                //既不是\r也不是\n,读一个就往缓冲区中存一个
                                else
                                        sb.append((char)ch);
                        }
                        //如果缓冲区中有数据
                        if(sb.length()!=0){
                                //把缓冲区数据返回
                                return sb.toString();
                        }
                } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
                //如果读到结尾,返回空
                return null;
        }
        //自定义close方法,关闭资源。
        public void myClose(){
                try {
                        r.close();
                } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
        }
}

public class Test{
        public static void main(String[] args) {
                FileReader fr=null;
                MyBufferedReader mbr=null;
                try {
                        fr = new FileReader("testsix.txt");
                        //初始化就传入一个流对象
                        mbr=new MyBufferedReader(fr);
                        String line=null;
                        //调用自定义的myReadLine方法
                        while((line=mbr.myReadLine())!=null){
                                System.out.println(line);
                        }
                } catch (FileNotFoundException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }finally{
                        //调用自定义的myClose方法,关闭资源。
                        mbr.myClose();
                }
        }
}
回复 使用道具 举报
make a mark
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马