所以我"听说" 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
已同步(如果错误,再次纠正我)?
答案 0 :(得分:1)
嗯,在第二种情况下,你测试两次路径是一个目录。此外,您实际上是在定义一个新的类,它具有相对较大的首次使用成本。
答案 1 :(得分:1)
这是因为您在filter
中使用DirectoryStream
谓词,使用谓词的流比使用谓词慢。您可以通过以下方式验证它:
Stream.of(file.listFiles()).filter(f -> f.isDirectory()).collect(Collectors.toList())
现在,您可以看到,DirectoryStream
比listFiles
更快。
因此,根本原因不在于DirectoryStream
和listFiles
,而是Stream
与filter predicate
一起使用。