首先看下为什么会返回-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而不是其它值呢 这里面是有一定道理的,具体你可以上网搜下 比较复杂 是通过二进制补位来操作的 |