黑马程序员技术交流社区

标题: 字节流和字符流读取数据 [打印本页]

作者: java--周群    时间: 2014-2-28 20:43
标题: 字节流和字符流读取数据
FileReader和FileiInputStream  他们的read();方法读取数据之后把读到的字符和字节数据转换成int类型的数据???GBK和unicode编码表是怎么使用的,这一块老是搞不清楚。

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

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

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

查下笔记,自己也复习下
作者: 午夜b'Boy    时间: 2014-2-28 22:07
FileReader读字符,用默认GBk码表,FileiInputStream读字节流,返回读取个数,指定一个码表用转换流lnputstreamReader他是fileReader的父类
作者: xietansheng    时间: 2014-3-1 00:09
本帖最后由 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码。

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








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