遍历整个目录树的文件和目录

在开发中我们常常需要遍历整个目录树,这是我们写一个这样的工具类,以后就方便多了,这个类中可以通过使用local()方法产生由本地目录中的文件构成的File对象数组,或者通过使用walk()方法产生给定目录下的由整个目录树中所有文件构成的List.
代码例子:

//辅助打印的工具类
public class PPrint {
      public static String pformat(Collection<?> c) {
        if(c.size() == 0) return "[]";
        StringBuilder result = new StringBuilder("[");
        for(Object elem : c) {
          if(c.size() != 1)
            result.append("\n  ");
          result.append(elem);
        }
        if(c.size() != 1)
          result.append("\n");
        result.append("]");
        return result.toString();
      }
      public static void pprint(Collection<?> c) {
        System.out.println(pformat(c));
      }
      public static void pprint(Object[] c) {
        System.out.println(pformat(Arrays.asList(c)));
      }
    }
    public final class Directory {
      public static File[]
    //返回当前目录下的文件
      local(File dir, final String regex) {
        return dir.listFiles(new FilenameFilter() {
          private Pattern pattern = Pattern.compile(regex);
          public boolean accept(File dir, String name) {
            return pattern.matcher(
              new File(name).getName()).matches();
          }
        });
      }
      public static File[]
      local(String path, final String regex) { // Overloaded
        return local(new File(path), regex);
      }
      //返回一个二元组对象
      public static class TreeInfo implements Iterable<File> {
        public List<File> files = new ArrayList<File>();
        public List<File> dirs = new ArrayList<File>();
        public Iterator<File> iterator() {
          return files.iterator();
        }
        void addAll(TreeInfo other) {
          files.addAll(other.files);
          dirs.addAll(other.dirs);
        }
        public String toString() {
          return "dirs: " +PPrint.pformat(dirs) +
            "\n\nfiles: " + PPrint.pformat(files);
        }
      }
      //开始递归
      public static TreeInfo
      walk(String start, String regex) { 
        return recurseDirs(new File(start), regex);
      }
      //重载
      public static TreeInfo
      walk(File start, String regex) { 
        return recurseDirs(start, regex);
      }
      //递归当前目录任何文件或子目录
      public static TreeInfo walk(File start) { 
        return recurseDirs(start, ".*");
      }
    //递归当前目录任何文件或子目录
      public static TreeInfo walk(String start) {
        return recurseDirs(new File(start), ".*");
      }
      static TreeInfo recurseDirs(File startDir, String regex){
        TreeInfo result = new TreeInfo();
        for(File item : startDir.listFiles()) {
          if(item.isDirectory()) {
            result.dirs.add(item);
            result.addAll(recurseDirs(item, regex));
          } else // 返回当前目录任何文件或子目录
            if(item.getName().matches(regex))
              result.files.add(item);
        }
        return result;
      }
      public static void main(String[] args) {
        if(args.length == 0)
          System.out.println(walk("."));
        else
          for(String arg : args)
           System.out.println(walk(arg));
      }
    } 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值