【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