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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 孔德智 于 2012-8-28 14:59 编辑



  • import java.io.*;
  • class MyLineNumberReader
  • {
  •     private Reader r;
  •     private int lineNum;
  •     MyLineNumberReader(Reader r)
  •     {
  •         this.r=r;
  •     }
  •     public void mySetNum(int lineNum )
  •     {
  •         this.lineNum=lineNum;
  •     }
  •     public int myGetNum()
  •     {
  •         return this.lineNum;
  •     }
  •     public void myClose() throws IOException
  •     {
  •         r.close();
  •     }
  •     public String myReaderLine() throws IOException
  •     {
  •         lineNum++;
  •         StringBuilder sb=new StringBuilder();
  •         int ch=0;
  •         while ((ch=fi.read())!=-1)
  •         {
  •             if (ch=='\r')
  •             {
  •                 continue;
  •             }
  •             if (ch=='\n')
  •             {
  •                 return sb.toString();
  •             }
  •             else
  •                 bu.append((char)ch);
  •         }
  •         if(sb.length()!=0)
  •             return sb.toString();
  •         return null;
  •     }
  • }
  • class FileReaderDemo4
  • {
  •     public static void main(String[] args) throws IOException
  •     {
  •         FileReader fr=new FileReader("write.txt");
  •         MyLineNumberReader myl=new MyLineNumberReader(fr);
  •         String line=null;
  •         while ((line=myl.myReaderLine())!=null)
  •         {
  •             System.out.println(myl.myGetNum()+":"+line);
  •         }
  •         myl.myClose();
  •    }
  • }
这个是毕老师讲的代码, 我觉得24行的代码 lineNum++;  该放在31行continue;的上面,每次到了下一行正好自增一下, 如果不改的话这样不就是每次读了了一整篇才自增一下的吗?我的理解上是不是哪里有问题,请大家帮下忙!thanks

评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1 赞一个!

查看全部评分

6 个回复

倒序浏览
  1. public String myReaderLine() throws IOException  
  2.     {  
  3.         lineNum++;  
  4.         StringBuilder sb=new StringBuilder();  
  5.         int ch=0;  
  6.         while ((ch=r.read())!=-1)  
  7.         {  
  8.             if (ch=='\r')  
  9.             {  
  10.                 continue;  
  11.             }  
  12.             if (ch=='\n')  
  13.             {  
  14.                 return sb.toString();  
  15.             }  
  16.             else  
  17.                sbappend((char)ch);  
  18.         }  
  19.         if(sb.length()!=0)  
  20.             return sb.toString();  
  21.         return null;  
  22.     }  
复制代码
这段代码就是每次读取一行,而不是读取一篇,当主函数调用时,主函数里每读取一行,就需要调用它一次
你把lineNum++; 放在那两个位置都是可以的,只是你还没理解这段代码读取了多少数据
代码里还有两个错误fi应改成r,bu应改成sb

评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1 赞一个!

查看全部评分

回复 使用道具 举报
王金科 发表于 2012-8-28 12:50
这段代码就是每次读取一行,而不是读取一篇,当主函数调用时,主函数里每读取一行,就需要调用它一次
你把lineN ...

while ((ch=r.read())!=-1) 这句代码不是要把这个文章读到末尾吗,假如读到一行是怎么跳出循环的?
执行到return sb.toString(); 就是跳出循环吗?
回复 使用道具 举报
孔德智 发表于 2012-8-28 13:11
while ((ch=r.read())!=-1) 这句代码不是要把这个文章读到末尾吗,假如读到一行是怎么跳出循环的?
执行 ...

主函数里  while ((line=myl.myReaderLine())!=null) 就是读一行,这时就会调用while ((ch=r.read())!=-1)读这一行的每一个数据,这一行读到末尾,就结束了,然后返回这一行的数据给主函数
回复 使用道具 举报
王金科 发表于 2012-8-28 13:56
主函数里  while ((line=myl.myReaderLine())!=null) 就是读一行,这时就会调用while ((ch=r.read())!=-1) ...

谢谢了,懂了
回复 使用道具 举报
问题已经解决
回复 使用道具 举报
孔德智 发表于 2012-8-28 14:35
问题已经解决

嗯,加油
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马