迭代及用递归遍历File文件

本文探讨了递归的概念,包括直接和间接递归,并强调了递归必须具备边界条件以防止栈内存溢出。文章通过示例介绍了如何使用递归计算1到n的和、求阶乘,以及如何利用递归遍历和搜索文件目录,特别是查找特定类型的文件。同时,提到了FileFilter接口在文件搜索中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

递归:指的是当前方法调用自己的一

递归的分类

  • 递归分为两类:直接递归和间接递归

  • 直接递归:称为方法自身调用自己的情况

  • 间接递归:可以归结为:方法A调用了方法B,方法B调用了方法C,方法C反过来又调用了方法A。

种现象。

注意事项

  • 递归一定要有边界条件 (条件限定),保证递归能够停止下来,否则会发生栈内存溢出。

  • 在递归当中虽然有限定条件,但是递归的次数也不能太多,否则也会发生栈内存溢出现象。

  • 构造方法禁止递归。

 递归实例代码:

1.计算1~n的和

public int  sum(int n){
  
   //设置边界条件
  if(n==1){
   return 1;
  }
  
  return n+sum(n-1);//递归调用自己
}

图解:

2.递归求阶乘

阶乘:所有小于及等于该数的正整数的乘积。

n的阶乘:n! = n * (n-1) * (n-2) * (n-3) * ... * 3 * 2 * 1

public int  sum1(int n){
  
   //设置边界条件
  if(n==1){
   return 1;
  }
  
  return n*sum1(n-1);//递归调用自己
}

3.递归打印文件多级目录:

 

 public static void main(String[] args) {
        // 找到Hello文件的路径
        File file = new File("C:\\Users\\admin\\Desktop\\Hello");
        //调用getAllFiles()
        getAllFiles(file);
    }

    /*
        定义一个方法,参数传递File类型的目录
        方法中要对目录进行遍历
     */
    public static void getAllFiles(File file) {
        // 表明file此时是一个目录
        System.out.println(file);
        //首先先获取到它直接子目录和直接子文件
        File[] files = file.listFiles();
        // 遍历files目录
        for (File f : files) {
            // 判断如果得到的f是一个目录,需要再次遍历
            if (f.isDirectory()) {
                // 表明f是一个目录,则继续遍历这个目录
                //getAllFiles方法就是获取所有的文件,参数传递的刚好是目录。所以直接调用getAllFiles:递归(自己调用自己)
                getAllFiles(f);
            } else {
                // 此时f不是一个目录,肯定是一个文件
                System.out.println(f);
            }
        }
    }

4.文件搜索:

        C:\Users\admin\Desktop\Hello目录中的所有的.txt文件

public static void main(String[] args) {
        //构建一个File对象得到C:\Users\admin\Desktop\Hello路径
        File file = new File("C:\\Users\\admin\\Desktop\\Hello");
        getAllTxt(file);
    }

    /*
        定义一个方法,遍历所有的.txt文件
        方法中依然需要传参数目录
     */
    public static void getAllTxt(File dir) {
        //System.out.println(dir);
        File[] files = dir.listFiles();
        //遍历files
        for (File f : files) {
            // 判断f是否是一个目录
            if (f.isDirectory()) {
               //递归调用自己
                getAllTxt(f);
            } else {
                // 先获取文件的名称
               /* String name = f.getName();
                //String path = f.getPath();
                 // 大写字符串转换成小写   (windows系统默认不区分大小写,linux系统区分大小写)
                 name = name.toLowerCase();
                // 再次判断名称是否以.txt结尾
                if (name.endsWith(".txt")) {
                    System.out.println(f);
                }*/
                // 链式编程
                if (f.getName().toLowerCase().endsWith(".txt")) {
                    System.out.println(f);
                }
            }
        }
    }

5.文件过滤器遍历搜索指定文件

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

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

 public static void main(String[] args) {
        //构建一个File对象得到C:\Users\admin\Desktop\Hello路径
        File file = new File("C:\\Users\\admin\\Desktop\\Hello");
        getAllTxt(file);
    }
    /*
        定义一个方法,遍历所有的.txt文件
        方法中依然需要传参数目录
     */
    public static void getAllTxt(File dir) {
        //System.out.println(dir);
        //File[] files = dir.listFiles();
        File[] files = dir.listFiles(new FileFilterImpl());
        //遍历files
        for (File f : files) {
            // 判断f是否是一个目录
            if (f.isDirectory()) {
                getAllTxt(f);
            } else {
                // 先获取文件的名称
                System.out.println(f);
            }
        }
    }
// 实现类中的代码
 @Override
public boolean accept(File pathname) {
    if (pathname.isDirectory()) {
        return true;
    }
    return pathname.getName()
        .toLowerCase()
        .endsWith(".txt");
}

  代码优化:

 

        //匿名类优化
        File[] files = file.listFiles(new FileFilter() {
            @Override
            public boolean accept(File pathname) {
                if (pathname.isDirectory()) {
                    return true;
                }
                return pathname.getName().toLowerCase().endsWith(".txt");
            }
        });
      

  //lambda表达式优化
        File[] files1 = file.listFiles(pathname -> pathname.getName().toLowerCase().endsWith(".txt") || pathname.isDirectory());
        for (File file1 : files) {
            if (file1.isDirectory()) {
                file2(file1);
            } else {
                System.out.println(file1.getAbsolutePath());

            }
        }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值