黑马程序员技术交流社区

标题: 求教,代码问题 [打印本页]

作者: 曾勇    时间: 2014-11-17 20:52
标题: 求教,代码问题
本帖最后由 曾勇 于 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();
                        }
                }
               
               
        }
}




作者: ls61532529    时间: 2014-11-17 23:32
本身sb变量就不是空 如果你if(sb!=null)虚拟机每次运行都不是空的话肯定就是死循环
作者: 曾勇    时间: 2014-11-17 23:50
ls61532529 发表于 2014-11-17 23:32
本身sb变量就不是空 如果你if(sb!=null)虚拟机每次运行都不是空的话肯定就是死循环 ...

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

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

还是不太懂,不过谢谢啦
作者: ls61532529    时间: 2014-11-18 00:10
兄弟你是黑马的学生吗?




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2