【发布时间】:2010-10-16 08:20:00
【问题描述】:
我尝试使用 java.io.FileReader 读取一些文本文件并将它们转换为字符串,但我发现结果编码错误,根本不可读。
这是我的环境:
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,我不需要自己设置字符编码?但是我目前确实得到了错误编码的数据,处理我的情况的正确方法是什么?谢谢。
【问题讨论】:
-
您还应该在循环中松开 String.valueOf() 并直接使用 StringBuffer.append(char[],int,int)。这样可以节省大量 char[] 的复制。还将 StringBuffer 替换为 StringBuilder。不过,这些都与您的问题无关。
-
我不想这么说,但是您在粘贴的部分之后阅读了 JavaDoc 吗?你知道,“要自己指定这些值,请在 FileInputStream 上构造一个 InputStreamReader。”的部分?
-
感谢您的评论,实际上我阅读了 JavaDoc,但我不确定是否应该自己指定这些值,并切换到“在 FileInputStream 上构造 InputStreamReader”。跨度>
-
是的,如果你知道文件不是平台默认编码,你必须告诉 InputStreamReader 使用哪一个。
标签: java file unicode encoding