在JAVA7中提供了新的遍历文件的方法,比原有File类的递归遍历效率要好大约30%左右。
测试结果:
测试用的File类的递归,是经过对比测试几种方法,找出相对效率较好的来和JAVA7进行测试。
1、12749个文件夹,83805个文件,大小43.5 GB
JAVA7:执行耗时 1.15 秒。
File类:执行耗时 2.131 秒。
2、127823 个文件夹,562525 个文件,大小133 GB
JAVA7:执行耗时 11.468 秒。
File类:执行耗时 16.449 秒。
下面是测试代码
JAVA7
Visitor类的实现代码
package test; import java.io.IOException; import java.nio.file.FileVisitResult; import java.nio.file.Path; import java.nio.file.SimpleFileVisitor; import java.nio.file.attribute.BasicFileAttributes; import java.util.ArrayList; import java.util.List; public class MyFileVisitor extends SimpleFileVisitor<Path> { private List<String> list_file =new ArrayList<String>(); @Override public FileVisitResult postVisitDirectory(Path dir, IOException exec) throws IOException { // 访问文件夹之前调用 //System.out.println("Just visited " + dir); return FileVisitResult.CONTINUE; } @Override public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException { // 访问文件夹之后调用 //System.out.println("About to visit " + dir); return FileVisitResult.CONTINUE; } @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { // 访问文件后调用 if (attrs.isRegularFile()) list_file.add(file.getFileName().toString()); //插入一个List<String>有别的用。 return FileVisitResult.CONTINUE; } @Override public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException { // 文件不可访问时调用 //System.out.println(exc.getMessage()); return FileVisitResult.CONTINUE; } public List<String> getList() { return list_file; } }
调用
public static void main(String[] args) throws IOException { Path fileDir = Paths.get("E:\拷贝\资料"); MyFileVisitor visitor = new MyFileVisitor(); long a=System.currentTimeMillis(); Files.walkFileTree(fileDir, visitor); //放到一个List<String>是有别的用处,跟测试无关 List<String> list = visitor.getList(); System.out.println("执行耗时 : "+(System.currentTimeMillis()-a)/1000f+" 秒 "); }
File类
private static void getAllFileInfo(String path) { File dirFile = new File(path); File[] files = dirFile.listFiles(); //开始遍历所有文件 for(int i=0;i<files.length;i++) { //子文件 if(files[i].isFile()) { File f = files[i]; } else //文件夹 { File f = files[i]; getAllFileInfo(f.getAbsolutePath()); } } }