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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© java--周群 中级黑马   /  2014-2-28 20:43  /  2601 人查看  /  3 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

FileReader和FileiInputStream  他们的read();方法读取数据之后把读到的字符和字节数据转换成int类型的数据???GBK和unicode编码表是怎么使用的,这一块老是搞不清楚。

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

3 个回复

倒序浏览
字节流:  处理字节数据的流对象。字节流可以处理设备上的所有数据,所以字节流一样可以处理字符数据。
      字符流:  为了方便于文字的解析,所以将字节流和编码表封装成对象,这个对象就是字符流。只要操作字符数据,优先考虑使用字符流体系。
     只有字符流才涉及到 字符编码.

Java中能够实现字节根据指定编码表转成字符的,有四个类:InputStreamReader和OutputStreamWriter,PrintStream和PrintWriter。它们都能够加构造时,指定编码表;但后两个是打印流,只能用于打印,使用有局限,所以相对而言,还是前两个转换流使用多一些。

  指定编码表的动作由构造函数完成:
    1.InputStreamReader(InputStream in,String charsetName)
        创建使用指定字符集的InputStreamReader。
    2.OutputStreamWriter(OutputStream out,String charsetName)
        创建使用指定字符集的OutputStreamWriter。

查下笔记,自己也复习下

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
午夜b'Boy 来自手机 中级黑马 2014-2-28 22:07:12
藤椅
FileReader读字符,用默认GBk码表,FileiInputStream读字节流,返回读取个数,指定一个码表用转换流lnputstreamReader他是fileReader的父类
回复 使用道具 举报
本帖最后由 xietansheng 于 2014-3-1 00:19 编辑

FileReader是字符流,可以指定编码格式,不指定也有默认的编码格式,因为文件在磁盘中存储时存的都是0或1二进制数,这一连串的的二进制数组成了一个文件(假设是文本文件),那么这一连串的0和1怎么才能变成文字显示出来呢?靠的就是字符集(GBK、UTF-8等),比如需要显示的是汉字,如果你使用FileReader字符流时,指定的编码是GBK,那么就把这些0和1二进制序列连续每两个字节(连续的16个0或1)组成一个数字,然后去查GBK字符集表对应的是什么字,然后就显示该字;如果你指定的编码是UTF-8,则把这些0和1二进制序列连续每三个字节(连续的24个0或1)组成一个数字,然后去查UTF-8字符集表对应的是什么字,然后就显示该字。

文本存储时也是一样,比如一串文字,你要把这串文字存储到磁盘,那么要怎么存储呢?磁盘中只能存储0和1这样的二进制数,那么存储时也需要指定的字符集编码格式,比如用GBK进行编码存储,那么就把这一串文字的每一个字分别去查GBK字符集表,看看每个字对应的两个字节长度的数字是什么,然后把这两个字节长度的数字(16个0或1)存储到磁盘,用UTF-8编码存储同理,所以如果你存储的编码和读取的编码不一致,就会导致查字符集表查不到或查错,就是乱码。比如你用GBK编码存储三个汉字,那么磁盘中就存了6个字节,如果你读取时用UTF-8字符集,那么读出来的就是两个字(乱码或查错)。

PS:GBK字符集两个字节表示一个汉字; UTF-8字符集3个字节表示一个汉字;
        而ASCII(英文字母和英文符号)不论是什么编码都不会乱码,因为所有的字符集都兼容ASCII码。

而对于字节流来说,存储的是二进制数,读取时也是二进制数,就没有编码的概念了。



评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

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