• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • YouClaw
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

maxw-obj

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

用递归方法解决一些常见的文件或目录的处理方式

1.递归打印多级目录

分析:多级目录的打印,就是当目录的嵌套。遍历之前,无从知道到底有多少级目录,所以我们还是要使用递归实现。

代码实现:

public class DiGuiDemo2 {
   public static void main(String[] args) {
    // 创建File对象
       File dir  = new File("D:\\aaa");
    // 调用打印目录方法
       printDir(dir);
  }
​
   public static void  printDir(File dir) {
    // 获取子文件和目录
       File[] files = dir.listFiles();
    // 循环打印
    /*
     判断:
     当是文件时,打印绝对路径.
     当是目录时,继续调用打印目录的方法,形成递归调用.
    */
       for (File file : files) {
  // 判断
           if (file.isFile()) {
            // 是文件,输出文件绝对路径
               System.out.println("文件名:"+ file.getAbsolutePath());
          } else {
            // 是目录,输出目录绝对路径
               System.out.println("目录:"+file.getAbsolutePath());
            // 继续遍历,调用printDir,形成递归
               printDir(file);
          }
      }
  }
}

2.文件搜索

分析:

  1. 目录搜索,无法判断多少级目录,所以使用递归,遍历所有目录。

  2. 遍历目录时,获取的子文件,通过文件名称,判断是否符合条件。

代码实现:


public class DiGuiDemo3 {
   public static void main(String[] args) {
       // 创建File对象
       File dir  = new File("D:\\aaa");
    // 调用打印目录方法
       printDir(dir);
  }
​
   public static void printDir(File dir) {
    // 获取子文件和目录
       File[] files = dir.listFiles();
   
    // 循环打印
       for (File file : files) {
           if (file.isFile()) {
            // 是文件,判断文件名并输出文件绝对路径
               if (file.getName().endsWith(".java")) {
                   System.out.println("文件名:" + file.getAbsolutePath());
              }
          } else {
               // 是目录,继续遍历,形成递归
               printDir(file);
          }
      }
  }
}

3.文件过滤器优化

java.io.FileFilter是一个接口,是File的过滤器。 该接口的对象可以传递给File类的listFiles(FileFilter) 作为参数, 接口中只有一个方法。

boolean accept(File pathname) :测试pathname是否应该包含在当前File目录中,符合则返回true。

分析:

  1. 接口作为参数,需要传递子类对象,重写其中方法。我们选择匿名内部类方式,比较简单。

  2. accept方法,参数为File,表示当前File下所有的子文件和子目录。保留住则返回true,过滤掉则返回false。保留规则:

    1. 要么是.java文件。

    2. 要么是目录,用于继续遍历。

  3. 通过过滤器的作用,listFiles(FileFilter)返回的数组元素中,子文件对象都是符合条件的,可以直接打印。

代码实现:


public class DiGuiDemo4 {
   public static void main(String[] args) {
       File dir = new File("D:\\aaa");
       printDir2(dir);
  }
 
   public static void printDir2(File dir) {
    // 匿名内部类方式,创建过滤器子类对象
       File[] files = dir.listFiles(new FileFilter() {
           @Override
           public boolean accept(File pathname) {
               return pathname.getName().endsWith(".java")||pathname.isDirectory();
          }
      });
    // 循环打印
       for (File file : files) {
           if (file.isFile()) {
               System.out.println("文件名:" + file.getAbsolutePath());
          } else {
               printDir2(file);
          }
      }
  }
}      

 

posted on 2026-05-27 10:49  知识札记  阅读(0)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3