A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© kevinmesss.tz 中级黑马   /  2014-3-3 21:00  /  1222 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 kevinmesss.tz 于 2014-3-6 17:29 编辑

FileReader为什么能读取字符
源码里面FileReader就封装了4个构造函数
按照毕老师的说法FileReader是封装了默认编码和字节流的字符流才对,
我没看到里面有一个提到编码问题的,英文注释看不到啊!

5 个回复

倒序浏览
FileReader 是对 InputStreamReader 的一个封装, 仅仅是调用了 InputStreamReader 的构造器, 方便读取字符文件。所以下面两个语句是等价的:
  1. Reader reader = new FileReader("fileName");
  2. Reader reader = new InputStreamReader(new FileInputStream("fileName"));
复制代码
因此, FileReader 将字节流转换为字符流、读取字符的功能都是由 InputStreamReader 完成的。
回复 使用道具 举报
所有的IO操作都是默认编码方式的,想查看自己的编码可以代码:
      Charset.defaultCharset() 或者Charset.defaultCharset().name()
返回的电脑操作系统的默认编码,我的window操作系统是GBK,eclipse代码运行后也是GBK,如果要重新指定编码,如UTF-8,则用转换流InputStreamReader(InputStream in, Charset cs) 和OutputStreamWriter(OutputStream out, Charset cs) ,代码:
       InputStreamReader(System.in, "UTF-8");,当使用指定编码方式的时候考虑转换流....
回复 使用道具 举报
zzmxhm 发表于 2014-3-3 22:03
FileReader 是对 InputStreamReader 的一个封装, 仅仅是调用了 InputStreamReader 的构造器, 方便读取字 ...

这个我理解
我看了InputStreamReader的源码
里面没有写它是如何读取字符的,
按理来说InputStreamReader里面应该封装了一个将两个字节解一次码的过程
不然字符流封装了字节流 没有这个解码的过程应该操作的还是字节吧?
我语言有点乱。。
回复 使用道具 举报
汪平乐 发表于 2014-3-4 09:20
所有的IO操作都是默认编码方式的,想查看自己的编码可以代码:
      Charset.defaultCharset() 或者Charse ...

这个我懂,我想知道的是它是如何读取字符的。。
字节流操作的是字节,字符流操作的是字符,
转换流把字节流封装在内部应该有个从字节变到字符的过程,
我的理解是应该是将两个字节解码一次。
我源码里面没找到
回复 使用道具 举报
本帖最后由 zzmxhm 于 2014-3-4 12:21 编辑
kevinmesss.tz 发表于 2014-3-4 11:25
这个我理解
我看了InputStreamReader的源码
里面没有写它是如何读取字符的,

InputStreamReader 中封装了一个 StreamDecoder 的实例,通过调用该对象的方法完成字符的读取,至于 StreamDecoder 是怎么工作的就看不到了。。。下面是源码:
  1. // InputStreamReader 的源码, 省略了不相关的部分

  2. import sun.nio.cs.StreamDecoder;

  3. public class InputStreamReader extends Reader {

  4.     // 封装的 StreamDecoder 对象
  5.     private final StreamDecoder sd;

  6.     public InputStreamReader(InputStream in) {
  7.         super(in);
  8.         try {
  9.             // 使用默认编码创建一个 StreamDecoder 对象
  10.             sd = StreamDecoder.forInputStreamReader(in, this, (String)null);
  11.         } catch (UnsupportedEncodingException e)
  12.             throw new Error(e);
  13.         }
  14.     }

  15.     public int read() throws IOException {
  16.         // 调用 StreamDecoder 的方法完成字符的读取
  17.         return sd.read();
  18.     }

  19. }
复制代码

PS: StreamDecoder 的源码在这里  http://www.docjar.com/html/api/sun/nio/cs/StreamDecoder.java.html

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马