为了账号安全,请及时绑定邮箱和手机立即绑定

Java FileReader编码问题

Java FileReader编码问题

侃侃尔雅 2019-10-26 13:31:34
我尝试使用java.io.FileReader读取一些文本文件并将其转换为字符串,但是我发现结果编码错误并且根本不可读。这是我的环境:Windows 2003,操作系统编码:CP1252Java 5.0我的文件是UTF-8编码或CP1252编码的,其中一些(UTF-8编码的文件)可能包含中文(非拉丁文)字符。我使用以下代码来完成我的工作:   private static String readFileAsString(String filePath)    throws java.io.IOException{        StringBuffer fileData = new StringBuffer(1000);        FileReader reader = new FileReader(filePath);        //System.out.println(reader.getEncoding());        BufferedReader reader = new BufferedReader(reader);        char[] buf = new char[1024];        int numRead=0;        while((numRead=reader.read(buf)) != -1){            String readData = String.valueOf(buf, 0, numRead);            fileData.append(readData);            buf = new char[1024];        }        reader.close();        return fileData.toString();    }上面的代码不起作用。我发现FileReader的编码为CP1252,即使文本为UTF-8编码也是如此。但是java.io.FileReader的JavaDoc说:此类的构造函数假定默认字符编码和默认字节缓冲区大小是适当的。这是否意味着如果我使用FileReader,则不需要我自己设置字符编码?但是我目前确实得到了错误的编码数据,应对情景的正确方法是什么?谢谢。
查看完整描述

3 回答

?
智慧大石

TA贡献1946条经验 获得超3个赞

是的,您需要指定要读取的文件的编码。


是的,这意味着您必须知道要读取的文件的编码。


不,没有一般的方法可以猜测任何给定“纯文本”文件的编码。


的构造函数FileReader始终使用平台默认编码,这通常是一个坏主意。


您需要使用而不是FileReader 。new InputStreamReader(new FileInputStream(pathToFile), <encoding>)


查看完整回答
反对 回复 2019-10-26
?
繁花不似锦

TA贡献1851条经验 获得超4个赞

FileReader 使用Java的平台默认编码,该编码取决于运行它的计算机的系统设置,并且通常是该区域设置中用户中最受欢迎的编码。

如果此“最佳猜测”不正确,则必须显式指定编码。不幸的是,FileReader不允许这样做(API中的主要监督)。相反,您必须使用文件new InputStreamReader(new FileInputStream(filePath), encoding),最好是从有关文件的元数据中获取编码。


查看完整回答
反对 回复 2019-10-26
?
HUX布斯

TA贡献1876条经验 获得超6个赞

使用InputStreamReader的FileInputStream比直接使用FileReader更好,因为后者不允许您指定编码字符集。


这是一起使用BufferedReader,FileInputStream和InputStreamReader的示例,以便您可以从文件中读取行。


List<String> words = new ArrayList<>();

List<String> meanings = new ArrayList<>();

public void readAll( ) throws IOException{

    String fileName = "College_Grade4.txt";

    String charset = "UTF-8";

    BufferedReader reader = new BufferedReader(

        new InputStreamReader(

            new FileInputStream(fileName), charset)); 


    String line; 

    while ((line = reader.readLine()) != null) { 

        line = line.trim();

        if( line.length() == 0 ) continue;

        int idx = line.indexOf("\t");

        words.add( line.substring(0, idx ));

        meanings.add( line.substring(idx+1));

    } 

    reader.close();

}


查看完整回答
反对 回复 2019-10-26
  • 3 回答
  • 0 关注
  • 875 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信