乱码问题,字符流原理

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值