学习在Java中使用行的流和LineNumberReader类来计算文件中的所有行。在所有列出的解决方案中,我们都在迭代这些行,直到遇到最后一行。
1.使用行流计算行数
Files.lines() 方法可以用来从一个指定的文本文件中获得行的流。然后我们可以使用stream.count() 方法来计算流中的元素。
请注意,文件是通过关闭流来关闭的。因此,为了使事情不那么冗长,我们可以使用try-with-resources语句,在使用后自动关闭流。
这种方法不需要整个文件存在于内存中,所以对于大文件来说是一种有效的解决方案。
String fileName = "c:/temp";
long noOfLines = -1;
try (Stream<String> fileStream = Files.lines(Paths.get(fileName))) {
//Lines count
noOfLines = (int) fileStream.count();
}
2.使用LineNumberReader
LineNumberReader 是一个记录行号的输入流阅读器。默认情况下,行数从0开始。
我们可以通过LineNumberReader对文件的引用来计算文件的总行数,skip() 到文件的最后一行。此刻,我们可以通过getLineNumber() 来获得行号计数。
这个方案对于大的文本文件也是很有效的。
String fileName = "c:/temp";
long noOfLines = -1;
try(LineNumberReader lineNumberReader =
new LineNumberReader(new FileReader(new File(fileName)))) {
//Skip to last line
lineNumberReader.skip(Long.MAX_VALUE);
noOfLines = lineNumberReader.getLineNumber() + 1;
}
3.对小文件使用Files.readAllLines()
我们也可以对小文件使用最初的两种解决方案。但是如果文件很小,而且我们要在以后的应用程序代码中引用文件内容,那么将整个文件读入内存是有意义的。
readAllLines() 方法读取整个文件并将所有行作为字符串列表返回。要计算所有的行,使用list.size() 方法。
这个解决方案需要整个文件存在于内存中,所以它对大文件来说不是一个有效的解决方案。
String fileName = "c:/temp";
long noOfLines = -1;
try(LineNumberReader lineNumberReader =
new LineNumberReader(new FileReader(new File(fileName)))) {
lineNumberReader.skip(Long.MAX_VALUE);
noOfLines = lineNumberReader.getLineNumber() + 1;
}
4.总结
在这个简短的Java教程中,我们学会了用Java查找文件中的总行数。我们看到了有效的解决方案,即Stream和LineNumberReader,也看到了糟糕的解决方案,如将整个文件读入List。
我们建议尝试每个解决方案进行性能比较,以找到符合你要求的最佳解决方案。
学习愉快!!