java io之输入字符流总结

1、Reader

                Reader是所有输入字符流的父抽象类,Java几乎为每一个InputStream都设计了一个对应的Reader,比如如果你想直接读取文件里的字符,可以用FileReader来代替FileInputStream。BufferedReader也是一个装饰者模式的reader,接收一个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。操作的数据是以字符为单位!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值