简单描述一下问题现象:
在业务需求中,需要按行写入和读取一个文本文件;在 idea 开发时,一切正常;打好 jar 包运行时,写入和读取的中文全部变成乱码了。。。
我的问题代码:
(代码段比较简单,就不写注释了):
1、写文件:
代码:
File file = new File("你的文件路径");
try (BufferedWriter writer = new BufferedWriter(new FileWriter(file))) {
writer.write("中文乱码");
writer.newLine();
}
代码执行后,查看文件内容如下:
��������
2、读文件
代码:
File file = new File("你的文本文件路径");
try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(file)))) {
String readLine;
while ((readLine = bufferedReader.readLine()) != null) {
System.out.println(readLine);
}
}
手动在文本文件中添加一个中文信息
我是要变成乱码的中文
读取结果:
��������
问题原因
中文乱码问题在于,当使用 Reader 和 Writer 读取和写入文件时,未设置编码方式,而使用了默认的编码方式(idea 运行时,默认编码 utf-8;jar 包运行时,默认编码 GBK);
代码调整如下:
1、写文件
File file = new File("你的文件路径");
// 给 StreamWriter 指定编码方式 UTF-8
try (OutputStreamWriter osWriter = new OutputStreamWriter(new FileOutputStream(file), StandardCharsets.UTF_8);
BufferedWriter writer = new BufferedWriter(new FileWriter(file))) {
writer.write("中文乱码");
writer.newLine();
}
2、读文件
File file = new File("你的文本文件路径");
// 给 StreamReader 指定编码方式 UTF-8
try (InputStreamReader isReader = new InputStreamReader(new FileInputStream(file), StandardCharset.UTF_8);
BufferedReader bufferedReader = new BufferedReader(isReader)) {
String readLine;
while ((readLine = bufferedReader.readLine()) != null) {
System.out.println(readLine);
}
}
通过显式设置 StreamReader 和 StreamWriter 的编码方式为 UTF-8,就解决了文件存取时出现的中文乱码问题啦