我想读取一个非常大的文件的最后 n 行,而不使用 Java 将整个文件读入任何缓冲区/内存区域。
我查看了 JDK API 和 Apache Commons I/O,但找不到适合此目的的。
我在想 tail or less 在 UNIX 中的处理方式。我认为他们不会加载整个文件然后显示文件的最后几行。在 Java 中也应该有类似的方法来做同样的事情。
原文由 Gaurav Verma 发布,翻译遵循 CC BY-SA 4.0 许可协议
我想读取一个非常大的文件的最后 n 行,而不使用 Java 将整个文件读入任何缓冲区/内存区域。
我查看了 JDK API 和 Apache Commons I/O,但找不到适合此目的的。
我在想 tail or less 在 UNIX 中的处理方式。我认为他们不会加载整个文件然后显示文件的最后几行。在 Java 中也应该有类似的方法来做同样的事情。
原文由 Gaurav Verma 发布,翻译遵循 CC BY-SA 4.0 许可协议
我发现使用 ReversedLinesFileReader
来自 apache commons-io api 是最简单的方法。此方法将为您提供文件从底部到顶部的行,您可以指定 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++;
}
原文由 akki_java 发布,翻译遵循 CC BY-SA 3.0 许可协议
12 回答5.8k 阅读
2 回答3.2k 阅读✓ 已解决
3 回答6.9k 阅读✓ 已解决
3 回答3k 阅读✓ 已解决
5 回答4.6k 阅读
4 回答2.2k 阅读
3 回答4.4k 阅读
如果您使用
RandomAccessFile
,则可以使用length
和seek
到达文件末尾附近的特定点,然后从那里向前读取如果您发现行数不足,请从该点后退并重试。一旦您弄清楚
N
最后一行的开始位置,您就可以找到那里,然后阅读并打印。可以根据您的数据属性做出最初的最佳猜测假设。例如,如果它是一个文本文件,行的长度可能不会超过 132 的平均值,因此,要获得最后五行,从结束前 660 个字符开始。然后,如果你错了,在 1320 处再试一次(你甚至可以使用你从最后 660 个字符中学到的知识来调整它 - 例如:如果这 660 个字符只是三行,下一次尝试可以是 660 / 3 * 5,加上可能有点额外以防万一)。