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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© liuyangyang 中级黑马   /  2013-4-8 22:10  /  1310 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


FileReader fr2=new FileReader("F:\\1\\123.txt");
  int len=0;
  char[] buf=new char[5];
  while((len=fr2.read(buf))!=-1)           //  为什么buf数组一存满,就会自动去判断len是否等于-1呢,这是怎么实现的啊?
  {
   for(char c:temp)
    System.out.println(c);
  }

请大侠们详细说下!在这里谢谢啦。

评分

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

查看全部评分

3 个回复

倒序浏览
内存里面一直有个指针往下指 只要还有内容 就会返回这次读到的字节个数,当读完没有时,返回-1

评分

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

查看全部评分

回复 使用道具 举报
首先看下为什么会返回-1 ,由于每个流的结尾都有一个流结尾标识,当流被读到这个标识时会返回-1以确定这个流已经结束
看下FileReader 所处流的层次   Reader--》InputStreamReader--》FileReader     当调用.read(cbuf)方法的时候  实际调用的是 Reader类中的
    /**
     * Reads characters into an array.  This method will block until some input
     * is available, an I/O error occurs, or the end of the stream is reached.
     *
     * @param       cbuf  Destination buffer
     *
     * @return      The number of characters read, or -1
     *              if the end of the stream
     *              has been reached
     *
     * @exception   IOException  If an I/O error occurs
     */
    public int read(char cbuf[]) throws IOException {
        return read(cbuf, 0, cbuf.length);
    }
这个方法
而这个方法又调用了  该类中的  abstract public int read(char cbuf[], int off, int len) throws IOException 这个抽象方法,所以根据继承关系可知  InputStreamReader 这个类 实现的read方法,而看InputStreamReader这个类的源码 发现 在read方法中调用了StreamDecoder类中的sd.read(cbuf, offset, length) 这个方法,在这个方法中有这么一段代码
           if (cb.position() == 0) {
               if (eof)//这里便是判断流是否读到末尾,如果读到末尾便返回-1
                   return -1;
               assert false;
           }
           return cb.position();


至于为什么会返回-1而不是其它值呢 这里面是有一定道理的,具体你可以上网搜下 比较复杂  是通过二进制补位来操作的

评分

参与人数 2技术分 +1 黑马币 +1 收起 理由
陈丽莉 + 1 吓了我一跳。。。
杜鹏飞 + 1 学习了!

查看全部评分

回复 使用道具 举报
其实这段代码中的while((len=fr2.read(buf))!=-1) 可以改成while((len=fr2.read(buf))>0)这样你可能更容易理解,
只要还有没读到的值。内存中的指针会指向下面一个,>0表示还有值没读完,就一直指下去,直到读完了,while((len=fr2.read(buf))=0)
而while((len=fr2.read(buf))!=-1) 是读到了换行的表示结束,知道的还好,但是看代码没有while((len=fr2.read(buf))>0)的容易理解   

评分

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

查看全部评分

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