【Exception】解决Java中BufferedReader读取中文乱码问题 BufferedReader读取json文件乱码

【Exception】解决Java中BufferedReader读取中文乱码问题 BufferedReader读取json文件乱码

一、问题描述

        1、在做一个json文件导入时,使用 BufferedReader 读取文件,上线后,发现josn反序列化失败,查看日志发现 读取的 json文件中文乱码了 ....

         2、核心代码如下:


public String read(MultipartFile file) throws IOException {
   StringBuffer sb = new StringBuffer();
   BufferedReader buffer = new BufferedReader(new InputStreamReader(file.getInputStream()));
   String line ;
   while((line = buffer.readLine()) != null) {
      sb.append(line);
   }
   buffer.close();
   return sb.toString();
}

二、问题解决

        1、InputStreamReader 类中,增加编码设置:"UTF-8" , 调用 带字符编码设置的构造方法:

public InputStreamReader(InputStream in, String charsetName)

        2、修改后的代码:

 三、问题分析

        1、当调用 public InputStreamReader(InputStream in) ,没字符集的构造方法时,可以看到传入字符集为 null

         

        2、StreamDecoder 类中的 forInputStreamReader(java.io.InputStream, java.lang.Object, java.lang.String) 方法如下,可以看到字符集为null时,则获取系统默认字符集。

         3、写一个方法,打印默认字符集

public static void main(String[] args) {
    String name = Charset.defaultCharset().name();
    System.out.println(name);
}

        4、 各个环境中输出结果分别如下:

  • Idea 中直接执行: UTF-8
  • Windows的CMD命令窗口: GBK
  • Linux CentOS8 :UTF-8

        5、然后再一确认,生产环境为Windows Server 。。。

         

        就是这么巧!

 

四、总结

        1、写代码,没考虑到多环境的情况,思考不够全面,虽然大部分生产服务器是Linux,但是还是有Windows存在的情况,代码不够健壮。

        2、同理,当使用io流,写出文件时,也应该设置编码:

FileOutputStream out = new FileOutputStream("");
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(out, "UTF-8"));

     

   3、遇到编码问题,可以使用 Charset.defaultCharset().name(); ,打印编码看看;注意区分不同环境的编码情况: 开发环境编码、生产环境编码; Windows 环境编码 、 Linux 环境编码

        4、使用 javac xx.java 编译,遇到中文乱码时,可以使用 encoding 参数,指定编码。

javac -encoding utf-8 ReadJsonTest.java

  • 9
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值