在 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.io.File 的listFiles() 方法。
其实这个结果也是预料中的:
- Java 7 肯定有性能上的改进,NIO.2 的性能应该好于之前的 IO 处理类
- listFiles 是 Java 6 及之前版本中的自带的方法,其它工具包应该都是在这个方法的基础上封装的,比该方法运行慢也是合理的
附录
- 本文完整代码下载:.
mvn compilemvn exec:java
运行结果如下: - 参考: