首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么File::listFiles比DirectoryStream更快-只接受目录

为什么File::listFiles比DirectoryStream更快-只接受目录
EN

Stack Overflow用户
提问于 2016-01-21 10:32:19
回答 2查看 1K关注 0票数 1

所以我“听说”Java7中引入的DirectoryStream比传统的目录列表方法更快。然而,对我来说情况并非如此。列出整个目录可能会更快,但当过滤出文件并只接受文件夹时,它需要更多的时间。例如,代码如下:

使用File

代码语言:javascript
复制
ArrayList<File> tempArray = new ArrayList();
for (File file : someFile.listFiles()){
    if(!file.isDirectory())
        continue;
    tempArray.add(file);
}

使用DirectoryStream

代码语言:javascript
复制
DirectoryStream<Path> stream = null;
try {
    stream = Files.newDirectoryStream(dir, new DirectoryStream.Filter<Path>() {
            public boolean accept(Path file) throws IOException {
                return Files.isDirectory(file);
            }
        });
} catch (IOException ex) {
}

ArrayList<File> files = new ArrayList();
for (Path path : stream)
    files.add(path.toFile());
stream.close();

第二种方法(使用DirectoryStream)要慢得多。我知道这两种方法都会检查每个文件,看看它的目录。或者是因为DirectoryStream是同步的(同样,如果错了,请纠正我)?

EN

回答 2

Stack Overflow用户

发布于 2016-01-21 10:49:44

那么,在第二种情况下,您将测试两次,以确定路径是一个目录。此外,您实际上是在定义一个新类,它具有相对较大的首次使用成本。

票数 1
EN

Stack Overflow用户

发布于 2016-01-21 11:25:09

这是因为您在DirectoryStream中使用filter谓词,带有谓词的流比集合慢。您可以通过以下方式进行验证:

代码语言:javascript
复制
Stream.of(file.listFiles()).filter(f -> f.isDirectory()).collect(Collectors.toList())

现在,您可以看到,DirectoryStreamlistFiles更快。

所以根本原因不是关于DirectoryStreamlistFiles,而是你在filter predicate中使用Stream

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34914401

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档