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

新手上路,请多包涵

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

我查看了 JDK API 和 Apache Commons I/O,但找不到适合此目的的。

我在想 tail or less 在 UNIX 中的处理方式。我认为他们不会加载整个文件然后显示文件的最后几行。在 Java 中也应该有类似的方法来做同样的事情。

原文由 Gaurav Verma 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 874
2 个回答

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

如果您发现行数不足,请从该点后退并重试。一旦您弄清楚 N 最后一行的开始位置,您就可以找到那里,然后阅读并打印。

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

原文由 paxdiablo 发布,翻译遵循 CC BY-SA 2.5 许可协议

我发现使用 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 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏