JAVA7遍歷文件夾

在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());
            }
       }
    }
相關文章
相關標籤/搜索