侧边栏壁纸
博主头像
luoxx博主等级

只要思想不滑坡,办法总比困难多

  • 累计撰写 59 篇文章
  • 累计创建 64 个标签
  • 累计收到 1,321 条评论

目 录CONTENT

文章目录

解决java读取本地文本文件部分中文乱码的问题

luoxx
2023-02-02 / 0 评论 / 1 点赞 / 2,599 阅读 / 349 字
温馨提示:
本文最后更新于 2023-02-08,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除,邮箱地址:luoxmc@vip.qq.com

java读取本地文件时,若使用InputStream来读取,经常会遇到读取到的内容中有一小部分中文乱码的情况

原因

gbk编码一个汉字占用2个字节,utf-8编码占用三个字节,如果文件是gbk编码还好,定义一个长度为偶数的字节数组接收stream的内容即可,但是utf-8编码就蛋疼了,根本没办法保证每次读取最后一位是不是会把那个汉字给切割开来,如果一个汉字的3个字节被切割成了两节,就会出现乱码。

  • 错误的代码示例
File file = new File("/root/a.txt");
FileInputStream in = new FileInputStream(file);
byte[] b = new byte[2048];
int c = 0;
StringBuilder text = new StringBuilder();
while((c = in.read(b)) != -1){
     text.append(new String(b,0,c));
}
System.out.println("读取到的文本内容:" + text.toString() );

解决办法

读取流的方式得改,不能用上面那种方式,修改后的代码如下

File file = new File("/root/a.txt");
FileInputStream in = new FileInputStream(file);
InputStreamReader isr = new InputStreamReader(in, StandardCharsets.UTF_8);
BufferedReader br = new BufferedReader(isr);
StringBuilder text = new StringBuilder();
while (br.ready()) {
    text.append(br.readLine()).append("\n");
}
System.out.println("读取到的文本内容:" + text.toString() );

使用InputStreamReader按行读取,new的时候注意指定编码,若为utf-8则填入 StandardCharsets.UTF_8

1

评论区