良葛格学习笔记输入输入一章中的PushbackInputStream的补充

在良葛格学习笔记输入输出一章中,本人感觉有些地方说的不是很清楚,现补充如下,望指正!

14.2.9 PushbackInputStream
    java.io.PushbackInputStream 拥有一个 PushBack 缓冲区, 从 PushbackInputStream 读出数据后,只要 PushBack 缓冲区没有满,就可以使用 unread() 将数据推回流的前端。
    举个使用 PushbackInputStream 的例子。假设一个文本文件中同时存储有 ASCII 码范围的英文字符与 BIG5 码范围的中文字符。您希望判断出哪些位置是 ASCII 而哪些位置是 BIG5 中文字符的位置, BIG5 中文字符使用两个字节来表示一个中文字,而ASCII 只使用一个字节来表示英文字符。
    BIG5 中文为了与 ASCII 兼容,低字节范围为 0xA4~0xF9,而高字节为 0x40~0x7E 以及 0xA1~0xFE。存储时低字节先存,再存高字节,所以读取时只要先读到字节是在 0xA4~0xF9,就表示它可能是一个中文字的前半数据。为了说明 PushbackInputStream 的功能,在范例14.15 中一次从文件中读取两个字节,并检查两个字节合并后的整数值是否在 0xA440 与 0xFFFF 之间,这样可以简单地判断其两个字节合并后是否为 BIG5 码。如果是 BIG5 码则使用这两个字节产生 String 实例以显示汉字字符;如果不在这个范围之内,则可能是个 ASCII 范围内的字符,您可以显示第一个字节的字符表示,并将读出的第二个字节推回流,以待下一次可以重新读取。

补充:
    BIG5码的编码方案:每个汉字由两个字节构成,第一字节(低字节)的范围 0X81-0XFE,共126种。第二个字节(高字节)的范围分别为 0X40-0X7E, 0XA1-0XFE,共157种。利用这两个字节共可定义出 126 * 157=19782种汉字。存储按照低字节先存入。所以编码范围是0x8140-0xFE7E, 0x81A1-0xFEFE。
    其中 0xA140-0xA17E, 0xA1A1-0xA1FE 是图形符号区;0xA440-0xF97E, 0xA4A1-0xF9FE 是汉字区。
     常用汉字如一、丁,BIG5码的范围为 0XA440-0XC671,共5401个;较不常用的字,如滥、调,即次常用字,范围为 0XC940-0XF9FE,共7652个。


     tmp = (short)((array[0] << 8 ) | (array[1] & 0xff));
     假如是汉字“这”,那么输出ffffd5e2
     tmp = tmp & 0xFFFF;
     输出d5e2

你可能感兴趣的:(良葛格学习笔记输入输入一章中的PushbackInputStream的补充)