- 首先科普一下知识,我们知道ASCII码中有128的数字,符号,或大小写字母,这对于英文来说已经够用了,一个字母占用一个字节(一个字节8bit),
- 存储的过程是这样的,一个字母w,找到ASCII码===》十进制====》二进制====编码====》补成8位一个字节。好存储到磁盘。(最小存储单元为一字节)(补位要补0)
- 解码就是这个过程反过来
- GBK兼容ASCII,也可以存储汉字,用两个字节存储,(高字节第一位为1)过程是这样的==一个汉字-----》查询GBK对应的十进制------》转为二进制即可。
- 万国码大声的说出来===Unicode~~~~~呀吼
- Unicode字符集的UTF-8编码格式
- 一个英文站一个字节,二进制第一位是0,转成十进制是正数
- 一个中文占三个字节,二进制第一位是1,第一个字节转成十进制是负数。
- 如何不产生乱码呢,
- 不要用字节流读取文本文件
- 编码解码时使用同一个码表,同一个编码方法
-
- 创建字符输入流对象:底层关联文件,并创建缓冲区(长度为8192的字节数组)
- 读取数据
- 判断缓冲区中是否有数据可以读取
- 缓冲区没有数据:就从文件中获取数据,装配到缓冲区中,每次尽可能装满缓冲区,如果文件中也没有数据了,返回-1
- 缓冲区有数据:就从缓冲区读取。
- 空参的read方法:一次读取一个字节,遇到中文一次读取多个字节,把字节解码并转成十进制返回。
- 有参的read方法:把读取字节,解码,强转三步合并了,强转之后的字符放到数组中。
- 一个问题:write()方法是不是当文件中有数据时会清除数据,那么当我们做了一个read方法后,紧接着执行write方法,那么我在执行read方法时会是什么样子的?
- 答案是:第一次read方法后会把文件中的数据读取到缓冲区中,当write进行清空操作只会清空本地文件中的数据,不会清除缓冲区的数据,这个时候再进行read会去缓冲区中拿第一次缓冲的数据。
-
- 这是三种往文件中写入的方式。
- flush刷新:刷新之后,还可以继续往文件中写入数据
- close关流:断开通道,无法再往文件中写出数据