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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 水。。。海 中级黑马   /  2013-7-19 11:27  /  1164 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 水。。。海 于 2013-7-19 21:20 编辑
  1. import java.io.*;
  2. class MyBufferedReader
  3. {
  4.         private FileReader r;
  5.         MyBufferedReader(FileReader r)
  6.         {
  7.                 this.r=r;
  8.         }
  9.         public String myReadLine() throws IOException
  10.         {
  11.                 StringBuilder sb=new StringBuilder();
  12.                 int ch=0;
  13.                 while((ch=r.read())!=-1)
  14.                 {
  15.                         if(ch=='\t')
  16.                                 continue;
  17.                         else if(ch=='\n')
  18.                                 return sb.toString();  //在这个循环中sb一直在接受值怎么做到一行一行打印的??
  19.                         else
  20.                                 sb.append((char)ch);  //如果是用主函数的while循环来控制的话,sb应该也是累加的,为什么
  21.                 }                                                                //sb接受一行字符之后又把前面的字符给清掉了????
  22.                 if(sb.length()!=0)
  23.                         return sb.toString();
  24.                 return null;
  25.         }
  26.         public void myClose() throws IOException
  27.         {
  28.                 r.close();
  29.         }
  30. }
  31. class MyBufferedReaderDemo
  32. {
  33.         public static void main(String[] args) throws IOException
  34.         {
  35.                 FileReader fr=new FileReader("Demo.java");
  36.                 MyBufferedReader mybuf=new MyBufferedReader(fr);
  37.                 String line=null;
  38.                 while((line=mybuf.myReadLine())!=null)
  39.                 {
  40.                         System.out.println(line);
  41.                 }
  42.                 mybuf.myClose();
  43.         }
  44. }
复制代码
问题在代码中写出来了,现在我是bug在这了,想不出为什么了,有点专牛角尖了

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1 淡定

查看全部评分

6 个回复

倒序浏览
每一次调用 ReadLine方法不是StringBuilder sb=new StringBuilder();又重新创建了一个sb吗?
回复 使用道具 举报
  1. package com.zh.io;

  2. import java.io.*;
  3. class MyBufferedReader
  4. {
  5.         private FileReader r;
  6.         MyBufferedReader(FileReader r)
  7.         {
  8.                 this.r=r;
  9.         }
  10.         public String myReadLine() throws IOException
  11.         {
  12.                 StringBuilder sb=new StringBuilder();
  13.                 int ch=0;
  14.                 while((ch=r.read())!=-1)
  15.                 {
  16.                         if(ch=='\t')
  17.                                 continue;
  18.                         else if(ch=='\n')
  19.                                 return sb.toString();  //在这个循环中sb一直在接受值怎么做到一行一行打印的??
  20.                                                        //在这儿,函数读到回车换行,函数就会结束,返回String字符串对象
  21.                         else
  22.                                 sb.append((char)ch);  //如果是用主函数的while循环来控制的话,sb应该也是累加的,为什么
  23.                                                         //sb接受一行字符之后又把前面的字符给清掉了????
  24.                                                       //一个字符一个字符的读入StringBuilder对象中,当时当函数执行结束后,函数会重新创建一个StringBuilder的对象
  25.                 }                                                               
  26.                 if(sb.length()!=0)
  27.                         return sb.toString();
  28.                 return null;
  29.         }
  30.         public void myClose() throws IOException
  31.         {
  32.                 r.close();
  33.         }
  34. }
  35. public class MyBufferedReaderDemo
  36. {
  37.         public static void main(String[] args) throws IOException
  38.         {
  39.                 FileReader fr=new FileReader("DataStream.java");
  40.                 MyBufferedReader mybuf=new MyBufferedReader(fr);
  41.                 String line=null;
  42.                 while((line=mybuf.myReadLine())!=null)
  43.                 {
  44.                         System.out.println(line);
  45.                 }
  46.                 mybuf.myClose();
  47.         }
  48. }
复制代码
哥们你想搞懂你的问题,主要是的明确你定义的函数的执行流程,我在你的代码中写了你的疑惑的地方,很简略,希望能给你点提示,对你思考有一定的指引

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1 赞一个!

查看全部评分

回复 使用道具 举报
周之浩 发表于 2013-7-19 11:44
哥们你想搞懂你的问题,主要是的明确你定义的函数的执行流程,我在你的代码中写了你的疑惑的地方,很简略, ...

照你的说法读一行后函数结束,主函数判断真假再执行输出语句,然后循环怎么又跳到函数处?
回复 使用道具 举报
水。。。海 发表于 2013-7-19 12:01
照你的说法读一行后函数结束,主函数判断真假再执行输出语句,然后循环怎么又跳到函数处? ...

主函数在判断时不就是调用定义的函数吗
回复 使用道具 举报
周之浩 发表于 2013-7-19 12:23
主函数在判断时不就是调用定义的函数吗

第一行字符串传给line后,主函数再判断,接着mybuf调用函数,sb是被重新建立了,但是方法为什么就从第二行开始取数据了?你能说一下函数执行的流程吗?
回复 使用道具 举报
周之浩 发表于 2013-7-19 12:23
主函数在判断时不就是调用定义的函数吗

我想通了,因为在执行过程中流并没有关闭,虽然重新执行函数但是r.read()一直都是一个流,只是有了循环以后就可以中途停止
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马