这是我的方法
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());
}
}
出于某种原因,我无法读取仅包含此文件的文件“ 名称 Intel(R) Core(TM) i5-2500 CPU @ 3.30GHz "
当我调试代码时,String s 返回为“\ufffd\ufffdN a m e”,我不知道这些额外字符的来源。这使我无法正确读取文件。
最佳答案
\ufffd 是 unicode 中的替换字符,当您尝试读取 unicode 中没有表示的代码时使用它。我假设您使用的是 Windows 平台(或者至少您阅读的文件是在 Windows 上创建的)。 Windows 支持多种文本文件格式,最常见的是 Ansi:每个字符都表示但它的 ansi 代码。
但 Windows 可以直接使用 UTF16,其中每个字符由其 unicode 代码表示为 16 位整数,因此每个字符 2 个字节。这些文件使用特殊标记(Windows 方言中的字节顺序标记)表示:
- 文件是用每个字符 2(甚至 4)字节编码的
- 编码是小端还是大端
(引用:MSDN 上的 Using Byte Order Marks)
当您在前两个替换字符 N a m e
而不是 Name
之后写入时,我想您有一个 UTF16 编码的文本文件。记事本可以透明地编辑这些文件(甚至不用说你的实际格式)但其他工具确实有问题......
优秀vim可以读取不同编码的文件并在它们之间进行转换。
如果你想在java中直接使用这种文件,你必须使用UTF-16字符集。来自 Charset
上的 JaveSE 7 javadoc:UTF-16 十六位 UCS 转换格式,由可选字节顺序标记标识的字节顺序
关于java - 为什么我的字符串返回 "\ufffd\ufffdN a m e",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24493220/