JAVA7遍历文件夹

在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());
            }
       }
    }

 

 

 

 

 

posted @ 2013-07-13 08:58  缤纷世界  阅读(4235)  评论(1编辑  收藏  举报