day27 递归 文件过滤器

今日内容

  • 递归

  • 文件过滤器

递归

自己指向自己,分为两类:直接递归和间接递归

直接递归:称为方法自身调用自己的情况
间接递归:可以归结为:方法A调用了方法B,方法B调用了方法C,C方法反过来又调用了方法A。

注意事项:

1.递归一定要有边界条件(条件限定),保证递归能够停止下来,否则会发生栈内存溢出。
2.在递归当中虽然有限定条件,但是递归的次数也不能太多,否则也会发生栈内存溢出的现象。
3.构造方法禁止递归。

递归求和(不推荐)

    public static void main(String[] args) {
        int sum = sum(3);
        System.out.println(sum);// 6
    }
    /*
        定义一个方法:使用递归操作 实现;累加和
        1 + 2 + 3 + 4 + .... + n
        n + (n-1) + (n-2) + (n-3) + ... + 1
        已知:
           最大值:n
           最小值:1
        使用递归必须明确:
           1.递归的结束条件:获取到1的时候结束
           2.递归的目的:获取下一个被加的数字(n-1)
     */
    public static int sum(int n) {
        if (n == 1) {
            return  1;
        }
        return n + sum(n-1);
    }

求阶乘

    public static void main(String[] args) {
        int summ =  summ(4);
        System.out.println(summ);//24
    }
//获取阶乘
    public static int summ(int n){
        if (n==1){
            return 1;
        }
        return  n*summ(n-1);
    }

递归遍历目录:

    public static void main(String[] args) {
        // 找到Hello文件的路径
        File file = new File("C:\Users\admin\Desktop\Hello");
        //调用getAllFiles()
        getAllFiles(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);
               /* File[] files1 = f.listFiles();
                for (File file1 : files1) {
                }*/
            } else {
                // 此时f不是一个目录,肯定是一个文件
                System.out.println(f);
            }
        }
    }

遍历txt文件

    public static void main(String[] args) {
        //构建一个File对象得到C:UsersadminDesktopHello路径
        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();
                 // 大写字符串转换成小写
                 name = name.toLowerCase();
                // 再次判断名称是否以.txt结尾
                if (name.endsWith(".txt")) {
                    System.out.println(f);
                }*/
                // 链式编程
                if (f.getName().toLowerCase().endsWith(".txt")) {
                    System.out.println(f);
                }
            }
        }
    }

文件过滤器

java.io.FileFillter是一个接口,是File的过滤器,该接口的对象可以传递给File类的listFiles(FileFilter)作为参数,接口当中只有一个方法:
boolean accept(File pathname) :  测试pathname是否应该包含在当前的File目录中,如果符合返回true

例题:

实现接口
public class FileFilterImpl implements FileFilter {
        /*
            过滤的规则:
                在accept方法中,判断File类对象是否以.txt结尾
                是就返回true
                不是就返回false
                如果此File对象是一个文件夹,则返回true,继续遍历这个文件夹
         */
        @Override
        public boolean accept(File pathname) {
            if (pathname.isDirectory()) {
                return true;
            }
            return pathname.getName()
                    .toLowerCase()
                    .endsWith(".txt");
        }
}

定义类
public class Demo06Recursion {

    public static void main(String[] args) {
        //构建一个File对象得到C:UsersadminDesktopHello路径
        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);
            }
        }
    }
}
原文地址:https://www.cnblogs.com/rxqq/p/14136374.html