使用递归的综合案例

1 文件搜索

搜索D:\图片 目录中的.png 文件。

分析

  1. 目录搜索,无法判断多少级目录,所以使用递归,遍历所有目录。
  2. 遍历目录时,获取的子文件,通过文件名称,判断是否符合条件。

代码示例:

import java.io.File;

/*
递归打印多级目录
搜素文件
只要.PNG格式的文件
 */
public class Recurison04 {
    public static void main(String[] args) {
        File file=new File("D:\\图片");
        getAllFile(file);
    }
    /*
    定义一个方法,参数传递File类型的目录
    方法中对目录进行遍历
     */
    private static void getAllFile(File dir) {
        File[] files = dir.listFiles();
        for (File f : files) {
            //对遍历得到的File对象进行判断,判断是否是文件夹
            if (f.isDirectory()){
                /*f是文件夹,则继续遍历这个文件夹。getAllFile方法就是传递文件夹、遍历文件夹的方法
                  所以直接调用getAllFile方法即可:递归(自己调用自己)*/
                getAllFile(f);
            }else{
                //1.把File对象f转换为字符串对象(3种方法)
                String n = f.getName();
                //String p = f.getPath();
                //String s = f.toString();

                //将字符串转换为小写
                String s = n.toLowerCase();

                //2.调用String类中的方法endWith判断字符串是否以.PNG结尾
                boolean b = s.endsWith(".png");
                //3.如果是,则输出该文件
                if (b) {
                    System.out.println(f);
                }

                //简单写法,链式
                if (f.toString().toLowerCase().endsWith(".png")){
                    System.out.println(f);
                }
            }
        }
    }
}

运行结果:
在这里插入图片描述

2 文件过滤器优化

  • 1.File[] listFiles(FileFilter filter)
    java.io.FilenameFilter接口:实现此接口的类实力可用于抽象路径名(File对象)的过滤器。
    作用:用来过滤文件(File对象)
    抽象方法:用来过滤文件的方法
    boolean accept(File pathname):测试指定抽象路径名是否应该包含在某个路径名列表中。
    参数File pathname:使用listFiles方法遍历目录,得到的每一个文件对象

  • 2.File[] istFiles(FilenameFilter filter)
    java.io.FilenameFilter接口:实现此接口的类实力可用于文件名的过滤器。
    作用:用于过滤文件名称
    抽象方法:用来过滤文件的方法
    boolean accept(File dir,String name):测定指定文件是否应包含在某一文件列表中。
    参数:
    File dir:构造方法中传递的被遍历的目录
    String name:使用listFiles方法遍历目录,获取的每一个文件/文件夹的名称

注意:两个过滤接口是没有实现类的,需要我们自己写实现类,重写过滤的方法accept,在方法中定义过滤规则

分析

  1. 接口作为参数,需要传递子类对象,重写其中方法。我们选择匿名内部类方式,比较简单。
  2. accept方法,参数为File,表示当前File下所有的子文件和子目录。保留住则返回true,过滤掉则返回false。保留规则:
    a. 要么是.png文件。
    b. 要么是目录,用于继续遍历。
  3. 通过过滤器的作用,listFiles(FileFilter)返回的数组元素中,子文件对象都是符合条件的,可以直接打印。

实现类:

import java.io.File;
import java.io.FileFilter;

public class FileFilterImpl implements FileFilter {
    @Override
    public boolean accept(File pathname) {
        /*
        accept方法返回值是一个布尔值
        true:就会把传递过去的File对象保存到File数组中
        false:就不会把传递过去的File对象保存到File数组中
         */

        //如果pathname是一个文件夹,返回true,继续遍历这个文件夹
        if (pathname.isDirectory()){
            return true;
        }
        return pathname.toString().toLowerCase().endsWith(".png");
    }
}

测试类:

import java.io.File;

public class Recurison05 {
    public static void main(String[] args) {
        File file=new File("D:\\图片");
        getAllFile(file);
    }
    /*
    定义一个方法,参数传递File类型的目录
    方法中对目录进行遍历
     */
    private static void getAllFile(File dir) {
        File[] files = dir.listFiles(new FileFilterImpl());
        /*
        listFiles方法一共做了三件事:
        1.对构造方法中传递的目录进行遍历,获取目录中的每一个文件/文件夹,封装为File对象
        2.调用参数传递的过滤器中的方法accept
        3.把遍历得到的每一个File对象传递给accept方法的参数pathname
         */
        for (File f : files) {
            //对遍历得到的File对象进行判断,判断是否是文件夹
            if (f.isDirectory()){
                /*f是文件夹,则继续遍历这个文件夹。getAllFile方法就是传递文件夹、遍历文件夹的方法
                  所以直接调用getAllFile方法即可:递归(自己调用自己)*/
                getAllFile(f);
            }else{
                System.out.println(f);
            }
        }
    }
}

3 匿名内部类优化

  1. FileFilter接口:
import java.io.File;
import java.io.FileFilter;
import java.io.FilenameFilter;

/*
使用匿名内部类优化
 */
public class Filter01 {
    public static void main(String[] args) {
        File file=new File("D:\\图片");
        getAllFile(file);
    }
    /*
    定义一个方法,参数传递File类型的目录
    方法中对目录进行遍历
     */
    private static void getAllFile(File dir) {
       File[] files = dir.listFiles(new FileFilter() {
            @Override
            public boolean accept(File pathname) {
                return pathname.isDirectory()||pathname.toString().toLowerCase().endsWith(".png");
            }
        });
        for (File f : files) {
            //对遍历得到的File对象进行判断,判断是否是文件夹
            if (f.isDirectory()){
                /*f是文件夹,则继续遍历这个文件夹。getAllFile方法就是传递文件夹、遍历文件夹的方法
                  所以直接调用getAllFile方法即可:递归(自己调用自己)*/
                getAllFile(f);
            }else{
                System.out.println(f);
            }
        }
    }
}

  1. FilenameFilter接口:
import java.io.File;
import java.io.FileFilter;
import java.io.FilenameFilter;

/*
使用匿名内部类优化
 */
public class Filter01 {
    public static void main(String[] args) {
        File file=new File("D:\\图片");
        getAllFile(file);
    }
    /*
    定义一个方法,参数传递File类型的目录
    方法中对目录进行遍历
     */
    private static void getAllFile(File dir) {
        File[] files=dir.listFiles(new FilenameFilter() {
            @Override
            public boolean accept(File dir, String name) {
                return new File(dir,name).isDirectory()||name.toString().toLowerCase().endsWith(".png");
            }
        });
        for (File f : files) {
            //对遍历得到的File对象进行判断,判断是否是文件夹
            if (f.isDirectory()){
                /*f是文件夹,则继续遍历这个文件夹。getAllFile方法就是传递文件夹、遍历文件夹的方法
                  所以直接调用getAllFile方法即可:递归(自己调用自己)*/
                getAllFile(f);
            }else{
                System.out.println(f);
            }
        }
    }
}

4 Lambda优化

分析:FileFilter是只有一个方法的接口,因此可以用lambda表达式简写。

lambda格式:

()->{ }

代码如下:

import java.io.File;

public class Filter01 {
    public static void main(String[] args) {
        File file=new File("D:\\图片");
        getAllFile(file);
    }
    /*
    定义一个方法,参数传递File类型的目录
    方法中对目录进行遍历
     */
    private static void getAllFile(File dir) {
    	//lambda简化
        File[] files=dir.listFiles((File d, String name)->{
            return new File(d,name).isDirectory()||name.toString().toLowerCase().endsWith(".png");
        });
        //lambda继续简化
        File[] files=dir.listFiles(( d, name)->
         new File(d,name).isDirectory()||name.toString().toLowerCase().endsWith(".png"));
         
        for (File f : files) {
            //对遍历得到的File对象进行判断,判断是否是文件夹
            if (f.isDirectory()){
                /*f是文件夹,则继续遍历这个文件夹。getAllFile方法就是传递文件夹、遍历文件夹的方法
                  所以直接调用getAllFile方法即可:递归(自己调用自己)*/
                getAllFile(f);
            }else{
                System.out.println(f);
            }
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值