这是我的方法
public void readFile3()throws IOException
{
try
{
FileReader fr = new FileReader(Path3);
BufferedReader br = new BufferedReader(fr);
String s = br.readLine();
int a =1;
while( a != 2)
{
s = br.readLine();
a ++;
}
Storage.add(s);
br.close();
}
catch(IOException e)
{
System.out.println(e.getMessage());
}
}
由于某种原因,我无法读取仅包含此内容的文件" 名称 英特尔(R)酷睿(TM)i5-2500 CPU @ 3.30GHz"
当我调试代码时,String s被返回为" \ ufffd \ ufffdN a m e"我不知道这些额外的字符来自哪里..这阻止我正确阅读文件。
答案 0 :(得分:7)
\ ufffd是unicode中的替换字符,当您尝试读取在unicode中没有表示的代码时使用它。我想你是在Windows平台上(或者至少你读到的文件是在Windows上创建的)。 Windows支持许多文本文件格式,最常见的是Ansi:每个字符都有代表,但代码是ansi代码。
但Windows可以直接使用UTF16,其中每个字符由其unicode代码表示为16位整数,因此每个字符有2个字节。这些文件使用特殊标记(Windows方言中的字节顺序标记)来表示:
(参考:MSDN上的Using Byte Order Marks)
当您在前两个替换字符N a m e
而不是Name
之后编写时,我认为您有一个UTF16编码的文本文件。记事本可以透明地编辑这些文件(甚至没有说出实际格式),但其他工具确实存在问题...
优秀的vim可以读取具有不同编码的文件并在它们之间进行转换。
如果要在java中直接使用此类文件,则必须使用UTF-16字符集。来自Charset
上的JaveSE 7 javadoc: UTF-16十六位UCS转换格式,由可选字节顺序标记标识的字节顺序
答案 1 :(得分:4)
您必须在读取文件时指定编码,在您的情况下可能是UTF-16。
Reader reader = new InputStreamReader(new FileInputStream(fileName), "UTF-16");
BufferedReader br = new BufferedReader(reader);
查看文档以获取更多详细信息:InputStreamReader class。
答案 2 :(得分:0)
检查文件是.odt,.rtf还是.txt以外的其他内容。这可能是导致额外的UTF-16字符出现的原因。另外,请确保(即使它是.txt文件)您的文件以UTF-8字符编码。
也许您的文档中包含UTF-16字符,例如“®”。