java 字符流相关的io操作原理分析

来源:互联网 发布:甜虾 知乎 编辑:程序博客网 时间:2024/05/16 17:51

1 一般文字编辑原件,如记事本等,保存内容格式默认为ANSI,次ANSI并不是指ASCII,次ANSI是和操作系统有关,对于简体中文    操作系统,ANSI是GBK(国标编码),对于英文操作系统,ANSI是ASCII,对于台湾的繁体版操作系统,ANSI是big5.

2 java语言内部使用的编码语言是unicode bigendian 。

3 java 字符相关的io ,如InputStreamReader,读取io流,如fileInputStream的时候,可以指定使用的编码格式,如:

InputStreamReader isr = new InputStreamReader(new FileInputStream("a.dat"),"UTF-8");

4 如果字符操作ap,没有显式指定编码格式,那么默认用什么编码格式呢?有3点假设(1)使用系统默认的,即ANSI(

gbk);(2)使用java默认的unicode ;(3)智能判断文件内容的保存格式。

5 经过试验验证,是使用系统默认的编码,即如果是简体中文操作系统,使用GBK编码。

6 代码如下:


对比信息:

要读取的文件内容

要读取的文件内容的16进制内容


可以看到,前2个byte是\u8640,是汉字咢的GBK编码值,第3个byte是\u54 ,是英文字母T的GBK码值


7 如果再java里面,以char方式读取文件里面的内容,每个char强制转换为int,然后打印出int的16进制值。那么,第一个char的16进制int值是多少呢?86?8640? .... 结果是:54a2 。为什么?

8 由此可见,内部的操作过程是这样子的,如以InputStreamReader方式读取文件,如果没有指定编码方式,默认对照系统的ANSI编码,即GBK ,所以读到数据8640,知道是中文汉字“咢”,因为java内部是Unicode编码的,“咢”的Unicode编码是54a2,所以char (java语言char长度是2个byte,即16位)中保存的是54a2,所以打印出来的结果是54a2 。

9 结果:



10 另外思考一点,如果文件内容中既有中文又有英文字符,从上可以知道,中文用2个byte保存,英文用1个byte,如“咢”用\u8640 ,"T"用\u54保存 。那么,读取的时候,怎么知道该读1个byte组成内容,还是2个byte组成内容呢?

原创粉丝点击