Java 遍历文件夹的几种方式及简单性能对比

在 Java 中,要遍历一个文件夹下的所有文件(包括子文件夹),有以下几种方式(或者叫工具)。

File.listFiles() 方法

通过 JDK 的 java.io.File 类的 listFiles() 方法,自己写代码,通过递归遍历目录及子目录的文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
staticCollection<File> listFiles(File root){
    List<File> files =newArrayList<File>();
    listFiles(files, root);
    returnfiles;
}
 
staticvoidlistFiles(List<File> files, File dir){
    File[] listFiles = dir.listFiles();
    for(File f: listFiles){
        if(f.isFile()){
            files.add(f);
        }elseif(f.isDirectory()){
            listFiles(files, f);
        }
    }
}

Plexus Utils 工具包

1
List<File> list = org.codehaus.plexus.util.FileUtils.getFiles(dir,null,null);

Google Guava 工具包

1
2
3
4
5
Files.fileTreeTraverser().breadthFirstTraversal(dir).filter(newPredicate<File>(){
    publicbooleanapply(File input) {
        returninput.isFile();
    }
});

Commons IO 工具包

1
Collection<File> files = org.apache.commons.io.FileUtils.listFiles(dir,null,true);

Java 7 NIO.2

1
2
3
4
5
6
7
8
9
10
finalList<File> files =newArrayList<File>();
SimpleFileVisitor<Path> finder =newSimpleFileVisitor<Path>(){
    @Override
    publicFileVisitResult visitFile(Path file, BasicFileAttributes attrs)throwsIOException {
        files.add(file.toFile());
        returnsuper.visitFile(file, attrs);
    }
};
 
java.nio.file.Files.walkFileTree(path, finder);

经过运行时间对比,Java 7 NIO.2 方式遍历文件是最快的,其次是通过 java.io.File 的listFiles() 方法。

其实这个结果也是预料中的:

  1. Java 7 肯定有性能上的改进,NIO.2 的性能应该好于之前的 IO 处理类
  2. listFiles 是 Java 6 及之前版本中的自带的方法,其它工具包应该都是在这个方法的基础上封装的,比该方法运行慢也是合理的

附录

  1. 本文完整代码下载:file-walk-test.zip.
    mvn compile
    mvn exec:java
    运行结果如下:File walk test output
  2. 参考:
    • Walking the File Tree
    • Pro Java 7 NIO.2

你可能感兴趣的:(Java 遍历文件夹的几种方式及简单性能对比)