黑马程序员技术交流社区

标题: IO中的一个问题 [打印本页]

作者: liuyangyang    时间: 2013-4-8 22:10
标题: IO中的一个问题

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);
  }

请大侠们详细说下!在这里谢谢啦。
作者: Keith    时间: 2013-4-8 22:27
内存里面一直有个指针往下指 只要还有内容 就会返回这次读到的字节个数,当读完没有时,返回-1
作者: HM黄祥为    时间: 2013-4-9 09:09
首先看下为什么会返回-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而不是其它值呢 这里面是有一定道理的,具体你可以上网搜下 比较复杂  是通过二进制补位来操作的
作者: CrazyProgram    时间: 2013-4-9 11:00
其实这段代码中的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)的容易理解   




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