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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李万海 中级黑马   /  2013-3-31 09:17  /  1347 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 李万海 于 2013-3-31 20:32 编辑
  1. import java.io.*;

  2. class MyBufferedReader //extends Reader//自定义装饰类,模拟BufferedReader
  3. {
  4.         private Reader r;
  5.         MyBufferedReader(Reader r)
  6.         {
  7.                 this.r = r;
  8.         }
  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=='\r')
  17.                                 continue;
  18.                         if(ch=='\n')
  19.                                 return sb.toString();
  20.                         else
  21.                                 sb.append((char)ch);
  22.                 }


  23.                 if(sb.length()!=0)
  24.                         return sb.toString();
  25.                 return null;
  26.         }

  27.         public void myClose()throws IOException
  28.         {
  29.                 r.close();
  30.         }
  31. }
  32. class Demo
  33. {
  34.         public static void main(String[]args)throws IOException
  35.         {
  36.                 MyBufferedReader mybr=new MyBufferedReader(new FileReader("ceshi.java"));
  37.                 BufferedWriter bufw=new BufferedWriter(new FileWriter("F:\\ooo.java"));
  38.                 String s=null;
  39.                 while((s=mybr.myReadLine())!=null)
  40.                 {
  41.                         bufw.write(s);
  42.                         bufw.flush();
  43.                         bufw.newLine();
  44.                 }        
  45.                         
  46.         }
  47. }
复制代码
这个是老师的例题,我传入的ceishi.java也就是普通的一个java文件,问题是sb.toString()到底吧\t\n放到StringBuilder里面没,
我理解是当读到\t的时候,退出本次循环,读下一个\n,这时符合if(ch=='\n')的条件,toString了,我理解错了没?
第二个问题是,return sb.toString();这里StringBuilder里并没有清空啊,前面的数据应该都在里面的啊,
复制应该重复的,可事实没有,我哪里理解错了?

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

3 个回复

倒序浏览
while((ch=r.read())!=-1)
                {
                        if(ch=='\r')
                                continue;//跳出本次循环 ,再继续 执行while((ch=r.read())!=-1){};所以 ch 没有添加加到sb中
                        if(ch=='\n')//结束本次循环 所以ch也没有添加到sb中
                                return sb.toString();
                        else
                                sb.append((char)ch);//这个你懂的 是添加到sb中去了
                }

第二个疑问


while((s=mybr.myReadLine())!=null)
{
         bufw.write(s);
          // bufw.write(s);每次都要新建一个StringBuilder 相当于每次sb都是一个空的,你可以在myReadLine()函数中添加一条打印语句放在放在int ch=0s上面。。
          bufw.flush();
          bufw.newLine();
}   

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
1.s=mybr.myReadLine()  是每次只读取一行数据,到\n时返回。 返回时无行分隔符\r\n。所以在写入时需要bufw.newLine() 再写入一个行分隔符
2.每次执行s=mybr.myReadLine()  时 在myReadLine() 方法中都会重新执行StringBuilder sb = new StringBuilder(); 创建一个新的StringBuilder对象。

myReadLine()方法是每次读取一行之后赋给s写入到bufw中,由bufw自行写入换行符。依次循环直到文件结尾



评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
若还有问题,请继续追问~  没有的话,请将帖子分类改成【已解决】~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马