4

我正在用一个简单的 Java 程序处理几个 txt 文件,我的第一步是计算每个文件的行数:

int count = 0;
br = new BufferedReader(new FileReader(myFile)); // myFile is the txt file in question
while (br.readLine() != null) {
    count++;
}

对于我的一个文件,Java 计算的行数正好是实际行数的两倍!起初这让我很困惑。我在 Notepad++ 中打开了每个文件,可以看到错误计数的文件以与其他文件完全相同的方式结束每一行,带有 CR 和 LF。我又摸索了一下,发现我所有的“ok”文件都是 ANSI 编码的,而一个问题文件被编码为 UCS-2 Little Endian(我对此一无所知)。我在其他地方得到了这些文件,所以我不知道为什么以这种方式编码,但当然将其切换到 ANSI 解决了这个问题。

但现在好奇心依然存在。为什么编码会导致双行计数报告?

谢谢!

4

2 回答 2

10

很简单:如果您在读取 ​​UCS-2(或 UTF-16)文本(例如 ANSI,或任何 8 位编码)时应用了错误的编码,那么每隔一个字符就是一个 0x0。然后,这会将 CR-LF 分解为 CR-0-LF,这被视为两行更改(一个用于 CR,一个用于 LF)。

于 2012-04-09T08:01:29.310 回答
9

这就是问题:

new FileReader(myFile)

这将使用平台默认编码。不要那样做。采用

new InputStreamReader(new FileInputStream(myFile), encoding)

encoding文件的适当编码在哪里。您必须使用正确的编码,否则您将无法正确读取文件。不幸的是,这当然取决于你知道编码......

编辑:要回答为什么行被重复计算而不仅仅是“我该如何解决”的问题,请参阅 Lucero 的回答 :)

于 2012-04-09T08:08:00.450 回答