我有一个包含20M +文件的目录。如果我试试
folder.list();
我需要大约5到10分钟来获取文件(有时甚至更多)。我不需要所有文件名,每次都只需要少量文件名。
在Linux中,如果我尝试:
ls -l | head -n 100
:它将永远需要ls -f | head -n 100
:只需几秒钟即可获得响应。因此,如果我使用ProcessBuilder
并运行类似ls -f | head -n 100
是否有本地方式在目录中列出固定数量的文件而无需使用ProcessBuilder
?
答案 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