Reader类是java.io.InputStream类的镜像。它是一个抽象类,有两个保护的构造函数。与InputStream和Writer类似,Reader类从不直接使用,只通过其子类来使用。它有三个read()方法,另外还有skip(),close(),ready(),mark(),reset()和markSupported()方法:
protected Reader()
protected Reader((bject lock)
public abstract int read(char[] text,int offset,int length) throws IOException
public int read() throws IOException
public int read(char[] text) throws IOException
public long skip(long n) throws IOException
public boolean ready()
public boolean markSupported()
public void mark(int readAheadLimit) throws IOException
public void reset() throws IOException
public abstract void close() throws IOException
由于与对应的InputStream类似,大多数方法都很容易理解。read()方法将一个Unicode字符作为一个int返回,可以是0到65535之间的一个值,或者在流结束时返回-1。read(char[] text)方法尝试使用字符填充数组text,并返回实际读取的字符数,或者在流结束时返回-1。read(char[] text,int offset,int length)方法尝试将length个字符读入text的子数组中(从offset开始持续length个字符)。它也会返回实际读取的字符数,或者在流结束时返回-1。skip(long n)方法跳过n个字符。mark()和reset()方法允许一些阅读器重置到字符序列中做标记的位置。markSupported()方法会告知阅读器是否支持标记和重置。close()方法会关闭阅读器和所有底层输入流,如果试图进一步取则会抛出IOException异常。
尽管与InputStream非常相似,但也有所例外:Reader类有一个ready()方法,它与InputStream的available()的用途相同,但语义却不尽相同。available()返回一个int,指定可以无阻塞地最少读取多少字节,但ready()只返回一个boolean,指示阅读器是否可以无阻塞地读取。问题在于,有些字符编码方式(如UTF-8)对于不同的字符会使用不同数量的字节。因此在实际从缓冲器区读取之前,很难说有多少个字符正在网络或文件系统的缓冲区中等待。