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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 曾勇 中级黑马   /  2014-11-17 20:52  /  1198 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 曾勇 于 2014-11-17 22:05 编辑

/*
需求:知道了BufferedReader中的readLine方法的原理有,
自定义一个类包含和readLine功能一直的方法。
*/
import java.io.*;
class MyBufferedReader
{
        private FileReader r;
        MyBufferedReader(FileReader r)
        {
                this.r=r;
        }
        //一次读一行数据的方法
        public String MyReaderLine()throws IOException
        {
        //定义一个临时数组容器,原BufferReader封装的是字符数组
        //为了演示方便,定义一个StringBuilder容器,因为最终还是要将数据变成字符串
                StringBuilder sb =new StringBuilder();
                int ch = 0;
                while((ch=r.read())!=-1)
                {
                        if(((char)ch)=='\r')
                                continue;
                        if(((char)ch)=='\n')
                                return sb.toString();
                        else
                                sb.append((char)ch);
                }
                /*为什么下面这句不可以换为,  if(sb!=null),如果换的话,结果就变为一个死循环,
                 还有如果下面这句不等于空的话,最后一句话还读的到吗?
                读不到的话那么在主函数中,while循环的判断语句不就一直为真,也进入了一个死循环嘛?
                但是不换的话,怎么没有问题啊?
                */
                if(sb.length()!=0)
                        return sb.toString();
                return null;        
        }
        public void MyColse()throws IOException
        {
                r.close();
        }
}
class MyBufferedReaderDemo
{
        public static void main(String args[])
        {
                 MyBufferedReader fr = null;
                try
                {
                        fr = new MyBufferedReader(new FileReader("Demo.txt"));
                        String s=null;
                        while((s=fr.MyReaderLine())!=null)
                        {
                                System.out.println(s);
                        }
                }
                catch(Exception e)
                {
                        e.printStackTrace();
                }
                finally
                {
                        if(fr!=null)
                        try
                        {
                                fr.MyColse();
                        }
                        catch(Exception e)
                        {
                                e.printStackTrace();
                        }
                }
               
               
        }
}



6 个回复

倒序浏览
本身sb变量就不是空 如果你if(sb!=null)虚拟机每次运行都不是空的话肯定就是死循环
回复 使用道具 举报
ls61532529 发表于 2014-11-17 23:32
本身sb变量就不是空 如果你if(sb!=null)虚拟机每次运行都不是空的话肯定就是死循环 ...

但是如果不判断一下,并返回的话,那最后一次读不到换行符时,最后一次读的数据不就打印不出来了嘛?
而且,用length()方法和这个方法都一样啊,就是判断StringBuilder里面有没有元素啊 ?
回复 使用道具 举报
ls61532529 发表于 2014-11-17 23:32
本身sb变量就不是空 如果你if(sb!=null)虚拟机每次运行都不是空的话肯定就是死循环 ...

但是如果不判断一下,并返回的话,那最后一次读不到换行符时,最后一次读的数据不就打印不出来了嘛?
而且,用length()方法和这个方法都一样啊,就是判断StringBuilder里面有没有元素啊 ?
回复 使用道具 举报
StringBuilder使用后没有被清空 sb!=null会永远成立 所以会进入死循环,但是如果清空掉StringBuilder 要存储的数据也就没有了不符合需求  所以用长度
回复 使用道具 举报
ls61532529 发表于 2014-11-18 00:03
StringBuilder使用后没有被清空 sb!=null会永远成立 所以会进入死循环,但是如果清空掉StringBuilder 要存 ...

还是不太懂,不过谢谢啦
回复 使用道具 举报
兄弟你是黑马的学生吗?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马