参考自:
Java FileWriter无法编码utf-8 转换方法
从OutStreamWriter 和Filewriter谈Java编码
原本想通过文件追加的方式,向.txt或者.json文件(其他也类似)结尾添加新的文本,开始通过FileWriter追加,但是中文追加后却成了乱码。
查了一圈下来结论是:Java FileWriter 默认是用(ISO-8859-1 or US-ASCII)西方编码的
(还是采用平台默认编码(视操作系统而定),待确认
),而FileWriter类没有setEncoding的方法。希望通过设置编码方式的计划破灭了。
那么就换一种方法吧:
BufferedWriter writer = new BufferedWriter (new OutputStreamWriter (new FileOutputStream (filePath,true),"UTF-8"));
不需要改动原来的代码,只需要用上面的代码替换原来的
FileWriter writer = new FileWriter(filePath,true);
运行代码,打开文本文件,中文又回来了!!!
补充:
向文件中写入数据的几种方式;
1、利用FileWriter
,但无法设置编码方式;
Writer writer = new FileWriter("C:\\Documents\\file.txt");
2、利用FileOutputStream
OutputStream os = new FileOutputStream("C:\\Documents\\file.txt");
3、利用OutputStreamWriter
,允许用户指定编码方式
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("C:\\Documents\\file.txt"), "GBK");
4、在3的基础上,再利用BufferedWriter
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("C:\\Documents\\file.txt"),"UTF-8"));
关于Java API的描述:
FileWriter
The constructors of this class assume that the default character encoding and the default byte-buffer size are acceptable.
这个类的构造函数假定用户使用默认的编码方式,并且允许使用默认的字节缓冲大小。
OutputStreamWriter
“An OutputStreamWriter is a bridge from character streams to byte streams: Characters written to it are encoded into bytes using a specified charset. The charset that it uses may be specified by name or may be given explicitly, or the platform’s default charset may be accepted.”
OutputStreamWriter是连接字符流和字节流的桥梁:写入这个类的字符流会被编码为“charset”所指示的编码格式。这个charset可以通过名字指定或是直接给出,也接受平台的默认charset(好像是UTF-8)。
另外FileWriter是OutputStreamWriter的子类。用Filewriter操作文件采取的是平台默认编码(视操作系统而定)。当要写入的文本文件编码和平台默认编码不一致时,就会出现中文乱码的情况。OutputStreamWriter可以避免这一点。
public class TestEncode {
public static void main(String[] args) throws IOException {
TestEncode test = new TestEncode();
test.test10();
test.test11();
}
public void test10() throws IOException {
FileOutputStream fileOutputStream = new FileOutputStream("C:/FileRoot/fileFour.txt");
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream, "GBK"); // 使用 GBK 编码文件
outputStreamWriter.write("Hello,world!\n欢迎来到 java 世界\n");
outputStreamWriter.append("另外一行内容");
outputStreamWriter.flush();
System.out.println("文件的编码为" + outputStreamWriter.getEncoding());
outputStreamWriter.close();
fileOutputStream.close();
}
public void test11() throws IOException {
FileInputStream fileInputStream = new FileInputStream("C:/FileRoot/fileFour.txt");
InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream, "GBK"); // 使用 GBK 解码文件
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String str;
while ((str = bufferedReader.readLine()) != null) {
System.out.println(str);
}
bufferedReader.close();
inputStreamReader.close();
}
}
输出为: