Java FileReader编码问题
我试图使用java.io.FileReader来读取一些文本文件,并将它们转换为string,但我发现结果是错误的编码,根本不可读。
这是我的环境:
-
Windows 2003,操作系统编码:CP1252
-
Java 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,我不需要自己设置字符编码? 但是我目前得到了错误的编码数据,处理我的情况的正确方法是什么? 谢谢。
是的,你需要指定你想要读取的文件的编码 。
是的,这意味着你必须知道你想要读取的文件的编码。
不,没有一般的方法来猜测任何给定的“纯文本”文件的编码。
FileReader
的构造函数总是使用平台默认编码,这通常是一个坏主意 。
您需要使用new InputStreamReader(
new FileInputStream(pathToFile)
, <encoding>)
来代替FileReader。
FileReader
使用Java的平台默认编码,这取决于它所运行的计算机的系统设置,并且通常是该语言环境中用户中最受欢迎的编码。
如果这个“最佳猜测”不正确,那么你必须明确指定编码。 不幸的是, FileReader
不允许这个(在API中的主要监督)。 相反,你必须使用new InputStreamReader(new FileInputStream(filePath), encoding)
,理想情况下从文件的元数据获取编码。