• 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"),
      );
  • 相关阅读:
    bootstrap多选框
    window.open()总结
    sql游标及模仿游标操作
    表变量及临时表数据批量插入和更新 写法
    表变量类型的创建及使用
    事物及exec
    [NOI2017]蚯蚓排队
    [NOI2017]游戏
    [NOI2017]蔬菜
    luogu P4194 矩阵
  • 原文地址:https://www.cnblogs.com/xiaozu/p/4555946.html
Copyright © 2020-2023  润新知