为什么我的字符串返回“ \ ufffd \ ufffdN am e”

Xav*_*ier 5 java filereader bufferedreader

这是我的方法

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());
    }
}
Run Code Online (Sandbox Code Playgroud)

由于某些原因,我无法读取仅包含以下文件:“名称为Intel(R)Core(TM)i5-2500 CPU @ 3.30GHz”

当我调试代码时,String s返回为“ \ ufffd \ ufffdN am e”,我不知道这些多余字符来自何处。.这使我无法正确读取文件。

Ser*_*sta 8

\ ufffd是unicode中的替换字符,当您尝试读取没有unicode表示形式的代码时使用。我想您是在Windows平台上(或者至少您读取的文件是在Windows上创建的)。Windows支持多种格式的文本文件,最常见的是Ansi:每个字符都可以表示,但是其ansi代码却可以。

但是Windows可以直接使用UTF16,其中每个字符由其Unicode代码表示为16位整数,因此每个字符2个字节。这些文件使用特殊标记(Windows方言中的字节顺序标记)表示:

  • 该文件每个字符用2(甚至4)个字节编码
  • 编码是小端或大端

(参考:在MSDN上使用字节顺序标记

当您在前两个替换字符之后N a m e而不是之后书写时Name,我想您有一个UTF16编码的文本文件。记事本可以透明地编辑那些文件(甚至不说您的实际格式),但是其他工具确实存在这些问题。出色的vim可以读取具有不同编码的文件并在它们之间进行转换。

如果要直接在Java中使用此类文件,则必须使用UTF-16字符集。从JaveSE 7 javadoc开始CharsetUTF-16十六位UCS转换格式,字节顺序由可选的字节顺序标记标识