13

如果我编写此代码,我将其作为输出-> 首先:,然后是其他行

try {
    BufferedReader br = new BufferedReader(new FileReader(
            "myFile.txt"));

    String line;
    while (line = br.readLine() != null) {
        System.out.println(line);
    }
    br.close();

} catch (FileNotFoundException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}

我怎样才能避免它?

4

2 回答 2

19

您在第一行得到字符  因为这个序列是UTF-8 字节顺序标记 (BOM)。如果文本文件以 BOM 开头,则它很可能是由 Windows 程序(如记事本)生成的。

为了解决您的问题,我们选择将文件显式读取为 UTF-8,而不是任何默认的系统字符编码(US-ASCII 等):

BufferedReader in = new BufferedReader(
    new InputStreamReader(
        new FileInputStream("myFile.txt"),
        "UTF-8"));

然后在 UTF-8 中,字节序列 解码为一个字符,即 U+FEFF。此字符是可选的 - 合法的 UTF-8 文件可能以它开头,也可能不以它开头。因此,只有当它是 U+FEFF 时,我们才会跳过第一个字符:

in.mark(1);
if (in.read() != 0xFEFF)
  in.reset();

现在您可以继续使用其余代码。

于 2013-07-01T13:38:02.387 回答
2

问题可能在于使用的编码。尝试这个:

BufferedReader in = new BufferedReader(new InputStreamReader(
      new FileInputStream("yourfile"), "UTF-8"));
于 2013-07-01T13:07:05.283 回答