2

我有一个包含 20M+ 文件的目录。如果我尝试

folder.list();

获取文件大约需要 5~10 分钟(有时甚至更多)。我不需要所有文件名,每次只需要几个。

在 Linux 中,如果我尝试:

  • ls -l | head -n 100: 会永远
  • ls -f | head -n 100: 几秒钟后得到响应。

所以如果我使用ProcessBuilder和运行类似的东西,我可以快速列出文件ls -f | head -n 100

是否有一种本地方法可以在目录中列出固定数量的文件而无需使用ProcessBuilder

4

2 回答 2

5

是的,有办法使用Java NIO.2和 class DirectoryStream。此类实现了对目录条目的惰性迭代。您可以获取DirectoryStream<Path>using的实例Files.newDirectoryStream(path)(并且您可以获取 with 的实例Pathwith the static factory Paths.get)。

如果您使用的是 Java 8,则更简单的解决方案是使用Files.list()

返回一个惰性填充的Stream,其元素是目录中的条目。列表不是递归的。

然后你可以有

List<String> fileNames = Files.list(path)
                              .map(Path::getFileName)
                              .map(Path::toString)
                              .limit(100)
                              .collect(Collectors.toList());

检索给定的 100 个文件名path

于 2016-01-08T13:01:52.390 回答
1

如果 java7 nio 文件操作对您来说更快,您可以尝试。在我使用它们的一个案例中,它们是一个很大的改进:https ://docs.oracle.com/javase/tutorial/essential/io/walk.html

于 2016-01-08T12:54:57.280 回答