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

标签 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

更新 2:

也在 this 上试过了更大的文件。

Java程序的输出-

count = 20520212

wc命令的输出-

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

最佳答案

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

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

关于java - 为什么 BufferedReader 读取的行数多于 wc 命令检测到的大文件行数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22846081/

相关文章:

java - 为什么未设置 Autowiring setter 值?

java - 新对象 { } 构造

linux - 如何将/dev/sda 与/dev/sdb 交换?

linux - 进程可以拥有的每个不同 UID 的用途是什么?

c++ - 在 Linux 中 fork 一个子进程后没有数据

java - 构造 BufferedReader,以 BufferedReader 作为读取器

java - 使用 BufferedReader 跳过一行(跳过,但不读取)

java - 如何根据json中的属性编写jackson反序列化器

java - 为什么在我的 BufferedReader 中使用*更大*的缓冲区时性能会*差*?

java - 如何让 Android 应用程序与 MySQL 在线数据库一起工作?