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

时间:2010-01-26 09:12:26

标签: java apache-commons-io

是否有任何方法可以从文本文件中读取特定行?在API或Apache Commons中。 类似的东西:

String readLine(File file, int lineNumber)

我同意实施这一点很简单,但如果文件非常大,它的效率并不高。

9 个答案:

答案 0 :(得分:17)

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(..)并尝试跳过整行(使用正则表达式)。我不知道它是否会更有效率 - 基准它。

P.S。 效率我的意思是内存效率

答案 1 :(得分:5)

不是我知道的。

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

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

(当然,有适当的错误处理和资源关闭逻辑)。

答案 2 :(得分:1)

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

但是在线条长度不同的情况下,我认为没有其他方法可以一次读取它们,直到线数正确为止。

答案 3 :(得分:1)

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

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

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

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

答案 4 :(得分:1)

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

答案 5 :(得分:1)

guava有类似之处:

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

所以你可以做到

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

答案 6 :(得分:1)

Using File Utils:

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

答案 7 :(得分:0)

如果您打算以相同的方式使用同一文件(在特定行查找文本),则可以索引文件。行号 - &gt;偏移。

答案 8 :(得分:0)

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