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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值