从Java中的文本文件中读取特定行

有没有方法从文本文件中读取特定的行? 在API或Apache Commons中。 就像是 :

String readLine(File file, int lineNumber) 

我同意它的实现是微不足道的,但如果文件非常大,它的效率并不高。

 String line = FileUtils.readLines(file).get(lineNumber); 

会这样做,但它仍然存在效率问题。

或者,您可以使用:

  LineIterator it = IOUtils.lineIterator( new BufferedReader(new FileReader("file.txt"))); for (int lineNumber = 0; it.hasNext(); lineNumber++) { String line = (String) it.next(); if (lineNumber == expectedLineNumber) { return line; } } 

由于缓冲区,这将稍微更有效。

看看Scanner.skip(..)并尝试跳过整行(使用正则表达式)。 我不知道它是否会更有效率 – 基准它。

PS有效率我的意思是内存效率

不是我知道的。

请注意,对于行开始的位置,文件没有特定的索引,因此任何实用程序方法都可以完全有效:

 BufferedReader r = new BufferedReader(new FileReader(file)); for (int i = 0; i < lineNumber - 1; i++) { r.readLine(); } return r.readLine(); 

(当然,有适当的error handling和资源关闭逻辑)。

如果您正在阅读的行长度相同,那么计算可能会有用。

但是在线条长度不同的情况下,我认为除了线数是正确的之外,我不认为有一种方法可以一次读取它们。

不幸的是,除非你能保证文件中的每一行都是完全相同的长度,否则你将不得不通读整个文件,或至少读取你所追踪的行。

计算行数的唯一方法是在文件中查找换行符,这意味着您将不得不读取每个字节。

可以优化代码以使其整洁可读,但在下面你将始终阅读整个文件。

如果你要反复读取同一个文件,你可以解析文件并创建一个存储某些行号偏移量的索引,例如行100,200等的字节数。

因为文件是字节而不是面向行的 – 任何通用的解决方案复杂度最多都是O(n),n是文件大小(以字节为单位)。 您必须扫描整个文件并计算行分隔符,直到您知道要读取的文件的哪个部分。

番石榴有类似的东西:

 List Files.readLines(File file, Charset charset); 

所以你可以做到

 String line = Files.readLines(file, Charsets.UTF_8).get(lineNumber); 

使用File Utils:

 File fileFeatures = new File( "Homework1AdditionalFiles/jEdit4.3/jEdit4.3ListOfFeatureIDs.txt"); String line = (String) FileUtils.readLines(fileFeatures).get(lineNumber); 

如果要以相同的方式使用同一文件(在某行查找文本),则可以索引文件。 行号 – >偏移量。

根据这个答案 ,Java 8使我们能够从文件中提取特定的行。 该答案中提供了示例。