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

时间:2016-01-21 02:32:19

标签: java

所以我"听说" Java 7中引入的DirectoryStream比传统的目录列表方法更快。但是,对我来说情况并非如此。列出整个目录可能会更快,但是当过滤掉文件并仅接受文件夹时,需要花费更多时间。例如,这些是代码:

使用File

ArrayList<File> tempArray = new ArrayList();
for (File file : someFile.listFiles()){
    if(!file.isDirectory())
        continue;
    tempArray.add(file);
}

使用DirectoryStream

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已同步(如果错误,再次纠正我)?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

Stream.of(file.listFiles()).filter(f -> f.isDirectory()).collect(Collectors.toList())

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

因此,根本原因不在于DirectoryStreamlistFiles,而是Streamfilter predicate一起使用。