Java FileReader 读文件乱码现象

测试代码:

/**
package com.jwen;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

/**
 * @author jwen
 * 
 */
public class TestFileReaderAndWriter {

    public static void main(String[] args) {
        FileReader fr = null;
        FileWriter fw = null;
        try {
            fr = new FileReader("e:/file.txt");
        } catch (FileNotFoundException e) {
            System.out.println("the file isn't found!");
            return;
        }
        
        try {
            fw = new FileWriter("e:/file1.txt");
        } catch (IOException e) {
            System.out.println("the file read or write errors !");
            return;
        }
        
        int c = -1;
        try {
            while((c = fr.read()) != -1) {
                fw.write(c);                         //写进文件的也可能是乱码
                System.out.print((char)c); //如果你的系统不是中文的(比如英文)显示出的文字可能会是乱码
            }
            fw.flush();
        } catch (IOException e) {
            System.out.println("the file read or write errors !");
        } finally {
            try {
                fr.close();
                fw.close();
            } catch (IOException e) {
                System.out.println("the file close errors !");
            }
            
        }
    }

}

原因:

   你的文件编码默认是ANSI编码。

  不同的国家和地区制定了不同的标准,由此产生了 GB2312, BIG5, JIS 等各自的编码标准。这些使用 2 个字节来代表一个字符的各种汉字延伸编码方式,称为 ANSI 编码。在简体中文系统下,ANSI 编码代表 GB2312 编码,在日文操作系统下,ANSI 编码代表 JIS 编码。
  不同 ANSI 编码之间互不兼容,当信息在国际间交流时,无法将属于两种语言的文字,存储在同一段 ANSI 编码的文本中。

   如果你的系统是非中文的,你的ANSI对应着相应的编码。当读取一个文件中的中文时,就会出现乱码。当然通过FileWriter写入另一个文件时,也会是乱码。(因为问题出在读取上)

 

解决办法:

     1 通过另一个节点流FileInputStream转码。

          InputStreamReader isr = new InputStreamReader(new FileInputStream(file), "GBK"); //或GB2312,GB18030
          BufferedReader read = new BufferedReader(isr);

     2 如非要用FileReader的话,可以将要读取的文件改为通用的编码(如UTF-8).如txt的文件可以在另存为中设置编码。然后读取 显示 写入都是正常的。
--------------------- 
作者:superjackson 
来源:CSDN 
原文:https://blog.csdn.net/w304807481/article/details/8151953 
版权声明:本文为博主原创文章,转载请附上博文链接!

  • 10
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值