apache commons-io相关介绍-DirectoryWalker类

DirectoryWalker类

DirectoryWalker类主要用于处理遍历文件目录操作的类,在遍历文件目录的过程中可以对文件或文件夹做相应处理(添加钩子)。DirectoryWalker类是一个抽象类,使用的需要创建这个类的子类。这个类需要制定一个泛型参数,作为返回结果的类型。

类中的一些主要的函数:

  • handleStart 遍历处理开始时触发的函数
  • handleEnd 遍历处理结束时触发的函数
  • handleDirectory 遍历过程中如果是目录,则触发该函数
  • handleFile 遍历过程中如果是文件,则触发该函数
  • handleDirectoryStart 处理目录开始时触发的函数
  • handleDirectoryEnd 处理目录结束时触发的函数
  • filterDirectoryContents 自定义过滤目录中的文件
  • walk 开始遍历文件目录的函数,并返回处理的列表。有个一重载的walk函数,内部的实现方式就使用递归的方法去遍历子目录。

下面是一个简单遍历文件夹下所有文件名的例子:

static class ListFileWorker extends DirectoryWalker<File>{
     List<File> list(File startDirectory) throws IOException {
         ArrayList<File> files = new ArrayList<File>();
         walk(startDirectory, files);
         return files;
     }
     
     @Override
    protected void handleFile(File file, int depth, Collection<File> results)throws IOException {
         results.add(file);//文件名直接添加到返回结果列表
    }
}

main函数:

public static void main(String[] args) {
    ListFileWorker worker = new ListFileWorker();
    try {
        List<File> files = worker.list(new File("C:\Python27"));
        for (File file : files) {
            System.out.println(file);
        }
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

当然也可以添加FileFilter过滤掉文件夹或目录,这样就不会遍历那些被过滤掉的文件或者目录。

下面一个例子是中官方源代码中自带的测试用例中的代码:

/**
 * DirectoryWalker implementation that recursively lists all files and directories.
 */
static class ListDirectoryWalker extends DirectoryWalker<File> {
    ListDirectoryWalker() {
        super();
    }
    List<File> list(File startDirectory) throws IOException {
        ArrayList<File> files = new ArrayList<File>();
        walk(startDirectory, files);
        return files;
    }
    @Override
    protected void handleDirectoryStart(File directory, int depth, Collection<File> results) throws IOException {
        // Add all directories except the starting directory
        //遇到目录的时候也把目录加到结果列表中
        if (depth > 0) {
            results.add(directory);
        }
    }
    @Override
    protected void handleFile(File file, int depth, Collection<File> results) throws IOException {
        results.add(file);
    }
}

下面给出java doc中给出的一些例子:

//FileCleaner.java
//遍历目录,删除.svn目录(和其子文件)
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.apache.commons.io.DirectoryWalker;
public class FileCleaner extends DirectoryWalker {
    public FileCleaner() {
        super();
    }
    public List clean(File startDirectory) throws IOException {
        List results = new ArrayList();
        walk(startDirectory, results);
        return results;
    }
    protected boolean handleDirectory(File directory, int depth,
            Collection results) {
        // delete svn directories and then skip
        if (".svn".equals(directory.getName())) {
            directory.delete();
            return false;
        } else {
            return true;
        }
    }
    protected void handleFile(File file, int depth, Collection results) {
        // delete file and add to list of deleted
        file.delete();
        results.add(file);
    }
}

添加FileFilter的推荐方法:

public class FooDirectoryWalker extends DirectoryWalker {
    //dirFilter目录过滤器,fileFilter文件类型过滤器
    public FooDirectoryWalker(IOFileFilter dirFilter, IOFileFilter fileFilter) {
      super(dirFilter, fileFilter, -1);
    }
  }
  
  // Use the filters to construct the walker
  FooDirectoryWalker walker = new FooDirectoryWalker(
    HiddenFileFilter.VISIBLE,
    FileFilterUtils.suffixFileFilter(".txt"),
  );
原文地址:https://www.cnblogs.com/xiaozu/p/4555946.html