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组成内容呢?
- java 字符流相关的io操作原理分析
- 【java基础】IO流的操作分析
- java IO操作(二)---字符流的缓冲区
- 86、java的IO操作-字符缓冲流
- Java IO 文件读写相关的操作
- java IO 字符编码相关
- java IO流字符流FileReader操作
- java字节流字符流IO操作
- Java IO 字节流 字符流操作
- java IO操作(一)--字符流
- java IO 字节流 字符流流操作
- Java IO流原理之常用字节流和字符流详解以及Buffered高效的原理
- Java IO 操作基础1---普通文件的相关操作
- Java IO 操作相关记录
- Java的IO流操作
- Java的IO流操作
- java io流的使用之字节流与字符流的操作
- JAVA 的IO操作(四)字节流和字符流的区别
- Leetcode 221. Maximal Square
- 剑指offer:(31)时间效率 :连续子数组最大和
- python初接触
- ubuntu下的jdk+eclipse安装
- [LeetCode] 143. Reorder List
- java 字符流相关的io操作原理分析
- 蓝桥杯_法训练—操作格子(线段树点更新与区间查询)
- PHP 5.3.0以上推荐使用mysqlnd驱动
- cocos 3.10 ccui.RichText修改计算行宽的计算方法
- tensorflow/tf.set_random_seed()
- 前向分步算法
- CI框架学习之--隐藏入口文件-index.php
- ajax的封装
- 关于深度学习中Dropout的理解