我正在完成 John Crickett 的编码挑战中的第一个练习,即创建一个
wc
克隆来计算文本文件中的行数、字节数、单词数和字符数。我正在执行第 4 步,正在计算字符。
到目前为止我的代码如下:
public static long countChars(File inputFile) {
long count = 0;
try (BufferedReader reader = new BufferedReader(new FileReader(inputFile))) {
String line;
while ((line = reader.readLine()) != null)
{
line = line.replaceAll("\uFEFF",""); // Remove BOM
count += line.length();
}
} catch (IOException e) {
e.printStackTrace();
}
return count;
}
问题是
wc
返回 339292
的输出,而我的代码返回 325001
。我最初怀疑我的代码只是忽略了换行符,并且我注意到了一些有趣的事情。 wc
的输出和我自己的代码的输出之间的区别是14291
缺少字符,这是行数的两倍加一。
我试图理解以下内容:
看来 wc 将
\r
和 \n
算作一个角色,而你却没有。
加上您忽略的 BOM,它会给出您所看到的差异。
如果您想计算
\r
和 \n
,您可能不应该按行阅读。如果是这样的话,我会按字符读取,然后每次读取\r
时保持一个状态,以忽略后面的\n
以增加行数。事实上,你似乎做了好几遍,一个是台词,另一个是人物,我猜还有一个是单词。
所以你只需要这个:
public static long countChars(File inputFile) {
long count = 0;
try (Reader reader = new FileReader(inputFile)) {
int r;
while ((r = reader.read()) > 0)
{
count ++;
}
} catch (IOException e) {
e.printStackTrace();
}
return count;
}
但是你可以用我提出的关于状态的建议一次性解决它,因为说最后一次读取是
\r
,不计算以下\n
。