Java中获取最新降序最后修改n个文件的最佳优化方法是什么-无需加载大目录的所有文件

问题描述

目标是获取最新的100个文件。 当前,它是通过扫描所有文件-准备文件列表-然后应用sort + limit来完成的。

这非常慢-在目录太大的情况下。因此,有没有什么方法或API可以执行此操作而不加载完整的文件列表。

文件在数千个范围内时,当前采用以下三种方法无法提供令人满意的性能

  • Files.listFiles-Java 1.2
  • DirectoryStream-Java 1.7
  • Files.Walk-Java 1.8

解决方法

您必须查看每个文件的属性以找到其使用期限,并且必须查看所有文件以找到最新的 N

您唯一的选择自由在于如何。例如,无需读取文件内容。

我会考虑使用Files.find()。从其文档中可以看出,这可以完成所需的最低工作。

您不需要保存所有文件。跟踪最新的100条中最古老的一条。如果“下一个”文件早于该文件,则无需保留该文件。否则,您必须找出要丢弃的100个中的哪个。在保留整个列表的开销与决定丢弃什么的开销之间进行权衡。如果文件数量远大于100,它可能对您有利。

在某种程度上,开销取决于文件系统。如果上次修改的时间存储在目录条目中,则无需查看inode即可获取它。当然,那不受您的控制。