1、Reader
Java几乎为每一个InputStream都设计了一个对应的Reader,比如如果你想直接读取文件里的字符,可以用FileReader来代替FileInputStream。BufferedReader也是一个装饰者模式的reader,接收一个Reader作为参数,从而对Reader提供缓存功能。
即read()和read(char cbuf[], int off, int len) 。read()和InputStream中的read()相似,不过这里是只读取一个字符,而这个方法通过调用read(char cbuf[], int off, int len) 来实现,这个方法是抽象方法,Reader的子类通过实现这个方法达到读取不同介质的目的。
Reader类可以读字符的原因是:一次读取两个或者三个字节,再通过编码方式将两三个字节转换成字符
2、InputStreamReader
InputStreamReader有一个重要的域,就是private final StreamDecoder sd,这个域帮助InputStreamReader解决了编码的问题,InputStreamReader的read()其实就是这个sd的read()方法。
InputStreamReader有四个构造函数,最主要的是前两个,第一个接收一个InputStream作为参数。第二个多了一个charsetName,这就是指定了编码方式。第一个不指定说明使用的是默认编码方式。
3、FileReader
FileReader继承了InputStreamReader,使用的字符输入方法是调用的super(new FileInputStream(file)),因此底层还是使用的InputStreamReader内的read()方法来进行输入字符。
4、BufferedReader
BufferedReader也继承了InputStreamReader,内部保存了一个char数组作为缓冲区,BufferedReader将Reader中的数据分批取到自己的buffer(char缓冲区)中,然后处理buffer中的数据。操作完buffer中的数据后,BufferedReader会从Reader中读取下一批数据到buffer中供程序处理。如此循环往复,直到Reader中数据被读取完毕。其中有一个很重要的方法fill(),每当buffer中的数据被读取完后,fill()就会从Reader中将数据填充到buffer中。
5、LineNumberReader
LineNumberReader继承了BufferedReader,相比BufferedReader主要增加了两个功能,分别是获取行号:getLineNumber()和设置行号:setLineNumber()。需要注意的是setLineNumber()可以设置行号,但不能改变读的位置。
6、FilterReader
FilterReader是字符过滤输入流,继承了Reader类,自身也是一个抽象类,所有的read()、skip()等方法都是直接调用的父类Reader的方法,没有像字节流那样有很多子类来实现不同的功能,可能因为字符流本身就是字节流的一种装饰,所以没必要再进行别的装饰,只是提供了一个扩展接口而已。
在字节流中、我们知道有很多具有特殊功能的类都是FilterInputStream和FilterOutputStream这两个类中的子类、他们都具有各自的特色、比如DataInputStream、DataOutputStream、BufferedInputStream、BufferedOutputStream、PrintStream等、但是在字符流中他们的设计却不是作为Filterxxx的子类来实现、而是直接作为Writer、Reader的子类出现、至于为什么这样设计、不知道、可能是对字符的操作比较简单、统一、没有像字节那样有许多地方要做特色处理、当然这样说并不是意味着字符流强大、相反还是字节流比较强大、字符流能完成的字节流都能完成、而反过来就不成立了。
7、PushbackReader
java.io.PushbackReader与前面提到的PushbackInputStream类似,都拥有一个PushBack缓冲区,只不过PushbackReader所处理的是字符。它有一个特殊的功能是:只要PushBack缓冲区没有满,就可以使用unread()将数据推回流的缓冲区,使用的方法是使用System.arraycopy(cbuf, off, buf, pos, len);将新字符数组赋值回缓冲数组内,使用read()读取的时候仍然读取的是缓冲数组内的字符,直到缓冲数组读取完毕,才从文件中读取数据,read()使用的方法也是System.arraycopy(),只不过是将缓冲区内的char[]复制给指定的char[]。
8、PipedReader
PipedWriter配合使用,互相使用connect()方法将管道流连接起来,当输入流有字符时,输出流可以在输入流程取数据写入文件。
9、StringReader
StringReader类用来将字符串转换成字符输入流。然后使用字符输入流提供的方式进行操作,也可以提供给其他高级字符输入流来使用。如可以将该字符输入流提供给BufferedReader输入流使用。
10、CharArrayReader
CharArrayReader 是字符数组输入流。它和ByteArrayInputStream类似,只不过ByteArrayInputStream是字节数组输入流,而CharArray是字符数组输入流。CharArrayReader 是用于读取字符数组,它继承于Reader。操作的数据是以字符为单位!