黑马程序员技术交流社区

标题: 关于FileReader和InputStreamReader [打印本页]

作者: xieshuhua    时间: 2012-5-18 17:01
标题: 关于FileReader和InputStreamReader
本帖最后由 谢述华 于 2012-5-18 19:05 编辑

今天看毕老师的IO视频,讲到FileReader中的read方法返回int型数据
但同时又看到InputStream已经将read方法覆写了,而且本身InputStreamReader很清楚是字节流转化为字符流的转换流。
做了下试验,FileReader和InputStreamReader均返回字节流数据。请问字节流转化为字符流转换主要体现在哪里
注:println()接受并显示Char数据。
试验代码和图如下:
  1. import java.io.File;
  2. import java.io.FileReader;
  3. public class cw {
  4. public static void main(String[] args) throws Exception {
  5. /*InputStreamReader x=new InputStreamReader(System.in);
  6. System.out.println(x.read());*/
  7. FileReader x= new FileReader("D:"+File.separator+"java"+File.separator+"hello.java");
  8. System.out.println(x.read());
  9. }
  10. }
复制代码

打印字符.png (2.17 KB, 下载次数: 34)

打印字符.png

InputStreamReader将read覆写.png (5.08 KB, 下载次数: 36)

InputStreamReader将read覆写.png

Reader返回int数据.png (5.8 KB, 下载次数: 40)

Reader返回int数据.png

作者: 乔建国    时间: 2012-5-18 18:00
InputStreamReader是字节流通向字符流的桥梁,它使用指定的charset读取字节并将其解码为字符。
它拥有一个InputStream类型的变量,并继承了Reader,使用了对象的适配器模式.
每次调用InputStreamReader中的read()方法都会导致从底层输入流读取一个或多个字节,通过给定的字符集,
将字节解码为字符。
FileReader 只能使用系统默认的字符集对字节进行解码,不能显示指定。
作者: xieshuhua    时间: 2012-5-18 18:15
我想问的是:字节流转化为字符流转换主要体现在哪里。。。
作者: 田林    时间: 2012-5-18 18:57
我觉得应该是可以调用BufferedReader对InputStreamReader对象进行装饰,然后就可以调用readLine()方法。这样读取文件更加高效!
作者: 彩虹    时间: 2012-5-18 19:26
       首先弄清楚数据在内存及磁盘上的存储格式,我们都知道,是以二进制方式存储的,因为计算机只能识别二进制语言。要想在控制台上看到的是一串能识别的字符,就必须要将从底层的字节流中读入的字节码转换为字符流中的字符,这就涉及到了字节流与字符流之间的相互转换,而InputStreamReader是字节流转化为字符流的桥梁,它向下面临的是从内存的底层字节流中读取字节码,向上面临的是字符流中的字符,所以当然要进行转换
作者: 李保成    时间: 2012-5-18 19:53
个人看法,不管是字节流还是字符流,对流的操作最终都是以字节的形式来完,而字符流只是将字节流封装,它并没有提供所谓的高效,而是提供了对数据操作的便捷。字符流的本质还是将字节流以字节的形式读入到数组中。所以当它读到下一个字节时,该字节为空时,它会将数组中的数据先返回,并在下次读取时,直接返回-1.至于为什么返回-1,表面上理解一下,是因为如果返回byte类型的数字时,该数字的长度有限,万一数组中存在该对应的值,那么结果就会出现错误。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2