「Java」「JAVA」字节流、字符流、缓冲流、转换流、内存流、字符编码( 五 )


面向字符的数组流/内存流 , CharArrayReader和CharArrayWriter , 该“流”会把数据暂存到内存中 , 以便实时读写 , 读写时使用的字符类型(char[
);
代码案例如下:
? 面向字符的数组流/内存流 案例
面向字符串的内存流 , StringReader/StringWriter , 把数据临时存储到字符串中 , 也同样是在内存中 , 但数据的类型是字符串;
案例代码如下:
面向字符串的内存流 案例
合并流合并流 , SequenceInputStream:能够将2个或者以上的InputStream合并成一个单一的InputStream , 进而进行合并操作;
合并流 案例
字符编码字符编码的发展历程:
阶段1:计算机只认识数字0和1 , 计算机里的一切数据都是以数字来表示;因为英文符号有限 , 所以规定使用的字节的最高位是0 , 每一个字节都是以0~127之间的数字来表示 , 比如:A对应65 , a对应97..这就是美国标准信息交换码-ASCII;
阶段2:随着计算机在全球的普及 , 很多国家和地区都把自己的字符引入了计算机中 , 比如汉字;但是ASCII中的一个字节能表示数字范围太小 , 不能包含所有的中文汉字 , 所以就规定使用两个字节来表示一个汉字;
所以决定 , 原有的ASCII字符的编码保持不变 , 仍然使用一个字节表示;为了区别一个中文字符与两个ASCII码字符:

  • 中文字符的每个字节最高位规定为1(中文的二进制是负数) , 这个规范就是GB2312编码;
  • 后来在GB2312的基础上增加了更多的中文字符 , 比如简体中文 , GBK应运而生;
阶段3:新的问题产生了 , 在中国是认识汉字的 , 支持GBK编码 , 但是如果把GBK编码的汉字传递给其他国家 , 该国家的编码表中没有收录该汉字的字符 , 故不能正常显示 , 很容易就出现了乱码 。
为了解决各个国家因为本地化字符编码带来的影响 , 把全世界所有的符号统一进行编码-Unicode编码;此时某一个字符在全世界任何地方都是固定的 , 比如字符:'哥' , 在任何地方都是以十六进制的54E5来表示 。 Unicode的每个编码字符都占有2个字节大小 。
常见的字符集:
  • ASCII:每个字符占一个字节 , 只能包含128个符号 , 不能表示汉字;
  • ISO-8859-1:每个字符占一个字节 , 收录西欧语言 , 不能表示汉字;
  • ANSI:每个字符占两个字节 , 在简体中文的操作系统中 , ANSI 就指的是 GB2312;
  • GB2312/GBK/GB18030:每个字符占两个字节 , 中文专用编码;
  • UTF-8:是一种针对Unicode的可变长度字符编码 , 又称万国码 , 是Unicode的实现方式之一 , 目前的应用率最高;
  • UTF-8 BOM:是微软搞出来的编码 , 默认占3个字节 , 使用率并不高;
编码中的第一个字节仍与ASCII兼容 , 这使得原来处理ASCII字符的软件无须或只须做少部份修改 , 即可继续使用 。 因此 , 它逐渐成为电子邮件、网页及其他存储或传送文字的应用中 , 优先采用的编码 。
互联网工程工作小组(IETF)要求所有互联网协议都必须支持UTF-8编码 。
存储字母 , 数字和汉字
存储字母和数字时无论是什么字符集都只占1个字节(因为和ASCII兼容) , 但是存储汉字:GBK家族占两个字节 , UTF-8家族占3个字节 。
存储中文时 , GBK和UTF-8都是OK的 。
字符编码 案例
小结
  1. InputStream 和 OutputStream
  2. Reader 和 Writer
  3. 文件过滤器
  4. 字节流
  5. 字符流
  6. 缓冲区
  7. 资源关闭

  8. 推荐阅读