java中获取文件总行数_关于java:如何以有效的方式获取文件中的行数?

本问题已经有最佳答案,请猛点这里访问。

我有一个大文件。 它包括大约3.000-20.000行。 如何使用Java获取文件中的行总数?

从你的评论到答案来判断,你要找的词是"有效的",而不是"有效的"。

是的,你是对的

@Firstthumb:请不要在人们回复评论后删除评论。 对于那些迟到演出的人来说,这让线程变得混乱。

为什么? 20,000线并不大。 数百万人很大。 为什么你认为你需要知道线的数量? 如果这样做,您可以在处理它们时对它们进行计数。 您必须读取整个文件才能计算行数。 你也可以同时做一些有用的事情。

BufferedReader reader = new BufferedReader(new FileReader("file.txt"));

int lines = 0;

while (reader.readLine() != null) lines++;

reader.close();

更新:为了回答这里提出的性能问题,我做了一个测量。第一件事:20.000行太少,以使程序运行一段时间。我创建了一个包含500万行的文本文件。这个解决方案(从没有像-server或-XX-options这样的参数的java开始)在我的盒子上需要大约11秒。与wc -l(UNIX命令行工具计数行)相同,为11秒。读取每个字符并寻找' n'的解决方案需要104秒,9-10倍。

你的意思是什么?性能?在这种情况下,你将没有更好的方法,因为行可以有不同的长度,你必须读取完整的文件,计算行数(wc也这样做)。如果你谈论编程效率,我肯定你可以把它放在一个实用程序方法(或者一些常见的库已经完成它)。

@Firstthumb。可能效率不高,但谁在乎呢。他只计算20k线,非常小。这段代码得到了我最简单的投票。

LineNumberReader的效率如何,因为它扩展了BufferedReader?

没有人说这比LineNumberReader好,至少我不这样做。

下一个问题?你为什么不这样做:D

我有点确定,BufferedReader的工作速度至少和FileReader一样快,并检查每一个字符。我通过测量时间证明了这一点(并且实际上表明检查每个字符的速度要慢得多)。但我认为LineNumberReader解决方案的效果与BufferedReader的解决方案一样好。这就是我赞成这个答案的原因。

检查每个字节应该肯定更快(使用缓冲区时),因为FileReader必须将字节解码为文本。

对于现代Java,Augustin的答案应该是可接受的答案。使用Files.lines。

Files.lines

使用Files.lines使用NIO时,Java 8+有一个非常好的简短方法。

Path path = Paths.get("./big_file.txt");

long lineCount = Files.lines(path).count();

UTF-8中的默认字符编码。您可以指定备用编码以匹配您的特定数据文件。

床解决方案。我们可以遇到charset的问题

charset默认为UTF-8

@Mikhail将特定数据文件的字符编码作为可选第二个参数中的Charset对象传递。见:Files.lines(Path path, Charset cs)。默认值为UTF-8;其他编码通过Charset。

Files.lines(路径).Count之间();不应该直接使用。相反,请尝试使用资源。示例:: long lineCount; try(Stream linesStream = Files.lines(path)){lineCount = linesStream.count(); }

使用LineNumberReader

就像是

public static int countLines(File aFile) throws IOException {

LineNumberReader reader = null;

try {

reader = n

你可能感兴趣的:(java中获取文件总行数)