所以我“听说”Java7中引入的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是同步的(同样,如果错了,请纠正我)?
发布于 2016-01-21 10:49:44
那么,在第二种情况下,您将测试两次,以确定路径是一个目录。此外,您实际上是在定义一个新类,它具有相对较大的首次使用成本。
发布于 2016-01-21 11:25:09
这是因为您在DirectoryStream中使用filter谓词,带有谓词的流比集合慢。您可以通过以下方式进行验证:
Stream.of(file.listFiles()).filter(f -> f.isDirectory()).collect(Collectors.toList())现在,您可以看到,DirectoryStream比listFiles更快。
所以根本原因不是关于DirectoryStream和listFiles,而是你在filter predicate中使用Stream。
https://stackoverflow.com/questions/34914401
复制相似问题