计算文本文件中正确的换行数

问题描述 投票:0回答:1

我正在完成 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
缺少字符,这是行数的两倍加一。

我试图理解以下内容:

  1. 为什么每行有两个换行符而不是一个?肯定每行末尾都有一个换行符吗?
  2. 额外的单个字符是什么?
  3. 简单地将行数加倍并将其添加到字符数上(然后+1)是否天真?这会让我在某些极端情况下陷入困境吗?
java string file char bufferedreader
1个回答
1
投票

看来 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

© www.soinside.com 2019 - 2024. All rights reserved.