Java:读取一个巨大文件的最后n行

2022-09-01 01:49:47

我想读取一个非常大的文件的最后n行,而不使用Java将整个文件读取到任何缓冲区/内存区域。

我环顾了一下JDK API和Apache Commons I / O,但无法找到适合此目的的。

我在想尾巴或更少在UNIX中的方式。我不认为他们加载整个文件,然后显示文件的最后几行。在Java中也应该有类似的方法来做同样的事情。


答案 1

我发现这是最简单的方法,通过使用apache commons-io api的ReversedLinesFileReader。此方法将为您提供从文件底部到顶部的行,您可以指定值以指定行数。n_lines

import org.apache.commons.io.input.ReversedLinesFileReader;


File file = new File("D:\\file_name.xml");
int n_lines = 10;
int counter = 0; 
ReversedLinesFileReader object = new ReversedLinesFileReader(file);
while(counter < n_lines) {
    System.out.println(object.readLine());
    counter++;
}

答案 2

如果使用 RandomAccessFile,则可以使用 length设法到达文件末尾附近的特定点,然后从那里向前读取。

如果发现没有足够的行,请从该点备份,然后重试。一旦你弄清楚了最后一行开始的地方,你就可以去那里,只是阅读和打印。N

可以根据数据属性做出初始最佳猜测假设。例如,如果它是一个文本文件,则行长度可能不会超过平均值 132,因此,要获取最后五行,请在结束前开始 660 个字符。然后,如果你错了,在1320再次尝试(你甚至可以使用你从最后660个字符中学到的东西来调整它 - 例如:如果这660个字符只是三行,那么下一次尝试可能是660 / 3 * 5,加上可能有点额外以防万一)。