Java FileWriter无法编码utf-8 转换方法

参考自:
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();
    }
}

输出为:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值