Java中使用字节流读取中文的问题--一定要注意各种编码占用的字节数

使用字节流读取中文的问题---会出现各种各样的错误,一定要注意各种编码占用的字节

实现文件的复制都是都过字节流的形式复制的,也就是说在操作系统调用写入获取方法时候,只认识字节流

字节流显然不符合中文等一些语言的实际场景,比如1个中文 

GBK:占用两个字节

UTF-8:占用3个字节

使用字节流读取中文文件,读取字母没啥问题,一旦是中文必然是乱码

先看一段代码一

package com.baidu.字节输入输出流;

import java.io.FileInputStream;
import java.io.IOException;

public class InputStream04 {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("F:\\develop\\e.txt");
        int len = 0;
        while ((len=fis.read())!=-1){
            System.out.println(len);
        }
        fis.close();
    }
}

输出结果:

239
187
191
228
189
160
229
165
189

代码二

package com.baidu.字节输入输出流;

import java.io.FileInputStream;
import java.io.IOException;

public class InputStream04 {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("F:\\develop\\f.txt");
        int len = 0;
        while ((len=fis.read())!=-1){
            System.out.println(len);
        }
        fis.close();
    }
}

输出结果:

196
227
186
195

可以发现两段代码除了构造方法中指定的文件路径不一致外,其他代码都是一致的,

而e.txt和f.txt中的内容都是“你好”,可是打印的结果为什么不同呢?

答:编码不同导致的,e.txt用的是utf-8编码,3个数字为一组,“228 189 160” 转为中文是“你”,“229 165 189”转换为中文是“好”

至于前面的“239 187 191”代表UTF-8的BOM头的影响所导致的,可以用条件语句过滤掉

f.txt文件编码是ANSL

转换为char类型的出现的不符合预期的转换效果,本来想要转换成“你好”的,但是转换了ä½å¥½这么些看不懂的乱码

 

package com.baidu.字节输入输出流;

import java.io.FileInputStream;
import java.io.IOException;

public class InputStream04 {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("F:\\develop\\e.txt");
        int len = 0;
        while ((len=fis.read())!=-1){
            System.out.println((char)len);
        }
        fis.close();
    }
}

输出结果:

 

ï
»
¿
ä
½
 
å
¥
½

字节流的缺点解决不了中文的问题,因为字节流是一个一个读取的,而字符流就可以很好的解决中文乱码的问题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值