在JAVA7中提供了新的遍歷文件的方法,比原有File類的遞歸遍歷效率要好大約30%左右。java
測試結果:ide
測試用的File類的遞歸,是通過對比測試幾種方法,找出相對效率較好的來和JAVA7進行測試。post
一、12749個文件夾,83805個文件,大小43.5 GB測試
JAVA7:執行耗時 1.15 秒。spa
File類:執行耗時 2.131 秒。code
二、127823 個文件夾,562525 個文件,大小133 GBblog
JAVA7:執行耗時 11.468 秒。遞歸
File類:執行耗時 16.449 秒。get
下面是測試代碼it
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()); } } }