为什么BufferedReader读取的行数多于wc命令检测到的大行文件?

时间:2014-04-03 18:35:28

标签: java linux bufferedreader

这是我的Java代码,用于检测文件中的行数 -

import java.io.BufferedReader;
import java.io.FileReader;

public class CountLinesInFile {

    public static int countLines(String filename) throws Exception{
        BufferedReader br = new BufferedReader (new FileReader(filename));
        int count = 0;
        String line = null; 

        do {
            line = br.readLine();
            count++;
        }
        while (line!=null);

        count--;
        br.close();

        return count;
    }

    public static void main(String[] args) throws Exception {

        String filename;
        //filename = "catalina6MB";
        //filename = "catalina14MB";
        filename = "catalina327MB";

        int count = countLines(filename);       
        System.out.println("count = "+count);
    }
}

当我使用较小的文件大小(如6MB或14MB)时,代码会提供与wc -l命令相同的结果。但是当我使用更大的文件(327MB)时,代码会报告更多的行 -

Java程序的输出 -

count = 4020049

输出wc命令 -

$ wc -l catalina327MB 
4020042 catalina327MB

为什么会这样?

更新

我在网上提供的this文件上试了一下。

Java程序的输出 -

count = 51229

输出wc命令 -

$ wc -l vendlist.txt 
51228 vendlist.txt

UPDATE2:

还在this更大的文件上试了一下。

Java程序的输出 -

count = 20520212

输出wc命令 -

$ wc -l enwiki-20140402-stub-meta-current18.xml 
20520206 enwiki-20140402-stub-meta-current18.xml

1 个答案:

答案 0 :(得分:1)

sed '$=' vendlist.txt生成51229(一个额外的行),而wc -l vendlist.txt生成51228. perl -lne 'END { print $. }' vendlist.txt生成 51229 的计数器。 cat -n vendlist.txt生成 51229 最后还有一个额外的换行符。

当我尝试使用您的代码时,我使用vendlist.txt获得 51229 。使用代码here时,我得到 51228 。根据文件和程序的不同,它可能会也可能不会丢弃文件末尾的空换行符或回车符。正如我尝试的各种程序所示,所有处理新行和回车的方式都不同(至少在文件末尾时)。我没有下载任何其他测试文件。