字节输入流的学习告一段落了,接下来的一段时间学习字符输入流。本文学习字符输入流的抽象类Reader与和字符输出流的抽象类Writer。
Reader
Reader是字符输入流的抽象类。子类必须实现的方法只有read(char[], int, int) 和close()。但是,多数子类将重写此处定义的一些方法,以提供更高的效率和/或其他功能。
下面学习下Reader.java的源码。
public abstract class Reader implements Readable, Closeable {
protected Object lock;//用于同步针对此流的操作的对象。
/**
* 构造函数之一
* 创建一个新的字符流Reader,其重要部分将同步其自身。
*/
protected Reader() {
this.lock = this;
}
/**
* 构造函数之一
* 创建一个新的字符流reader,其重要部分将同步给定的对象lock
*/
protected Reader(Object lock) {
if (lock == null) {
throw new NullPointerException();
}
this.lock = lock;
}
/**
* 试图将字符读入指定的字符缓冲区。
* 缓冲区可照原样用作字符的存储库:所做的唯一改变是put操作的结果。不对缓冲区执行翻转或重绕操作。
* 将输入流管道中的target.length个字节读取到指定的缓存字符数组target中、返回实际存放到target中的字符数。
*/
public int read(java.nio.CharBuffer target) throws IOException {
//获取此缓冲区中的剩余元素数
int len = target.remaining();
char[] cbuf = new char[len];
//试图将输入流中的len个字符读入cbuf,返回实际读取的字节数n
int n = read(cbuf, 0, len);
//如果实际读到字符的个数大于0
if (n > 0)
//将实际读取到的n个字符存入缓冲区
target.put(cbuf, 0, n);
//返回实际读取的字符数
return n;
}
/**
* 从输入流中读取单个字符。
*/
public int read() throws IOException {
char cb[] = new char[1];
if (read(cb, 0, 1) == -1)
return -1;
else
return cb[0];
}
/**
* 从输入流中读取一定数量的字符并把它们保存到缓冲数组b中。返回读取的字节数。
*/
public int