-
问题描述
在使用 Java 读写文件的过程中,当涉及到中文字符,会出现乱码的问题,读取内容与预期结果不符。
-
问题分析
所有的文件都是有编码格式的,其中 txt 和 Java 文件一般有三种编码格式:ISO8859-1、GSK 和 UTF-8.
其中 ISO8859-1 是西欧编码,不适用中文汉字;GSK 和 UTF-8 适用于中文。Windows 10下默认的编码格式是 UTF-8.
基于此,使用不同的编码格式读写文件,就会产生乱码。例如,eclipse 下默认的编码格式为 GBK,直接使用字符流读取会产生如下乱码。
- 代码部分
/**
* 缓冲字符流读文件
* @param inPath
* @return
* @throws Exception
*/
public static String testBufferedReader(String inPath) throws Exception {
BufferedReader bi = new BufferedReader(new FileReader(inPath));
StringBuffer sbr = new StringBuffer();
String s = null;
while((s = bi.readLine()) != null) {
sbr.append(s);
}
s = sbr.toString();
bi.close();
return s;
}
- 测试用例
- 测试结果
-
解决方案
使用转换流 InputStreamReader 和 OutputStreamWriter 按指定字符集解码文件,可解决这一问题。
- 代码部分
/**
* 缓冲字符流读文件
* @param inPath
* @return
* @throws Exception
*/
public static String testBufferedReader(String inPath) throws Exception {
BufferedReader bi = new BufferedReader(new InputStreamReader(new FileInputStream(inPath), "UTF-8"));
StringBuffer sbr = new StringBuffer();
String s = null;
while((s = bi.readLine()) != null) {
sbr.append(s);
}
s = sbr.toString();
bi.close();
return s;
}
- 测试用例
- 测试结果