这是我的 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/