如何有效地获取目录中的(某些)文件名

时间:2016-01-08 12:48:00

标签: java file-listing

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

folder.list();

我需要大约5到10分钟来获取文件(有时甚至更多)。我不需要所有文件名,每次都只需要少量文件名。

在Linux中,如果我尝试:

  • ls -l | head -n 100:它将永远需要
  • ls -f | head -n 100:只需几秒钟即可获得响应。

因此,如果我使用ProcessBuilder并运行类似ls -f | head -n 100

的内容,我可以快速列出文件

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

2 个答案:

答案 0 :(得分:5)

是的,有使用Java NIO.2和课程DirectoryStream的方法。此类对目录的条目实现惰性迭代。您可以使用Files.newDirectoryStream(path)获取DirectoryStream<Path>的实例(并且您可以使用静态工厂Paths.get获取Path的实例。)

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

  

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

然后你可以

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

检索给定path的100个文件名。

答案 1 :(得分:1)

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