• Java_File、递归


    java.io.File类是文件和目录路径名的抽象表示。主要用于文件和目录的创建、查找、删除等操作。

    可以使用File类的方法:

    • 创建一个文件、文件夹

    • 删除一个文件、文件夹

    • 获取一个文件、文件夹

    • 判断文件、文件夹是否存在

    • 对文件夹进行遍历

    • 获取文件的大小

    构造方法

    • public File(String pathname):通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。

    • public File(String parent,String child):根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。

    • public File(File parent,String child):根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。

    获取功能的方法

    • public String getAbsolutePath():返回此抽象路径名的绝对路径名字符串。

    • public String getPath():将此File转换为路径名字符串

    • public String getName():返回由此File表示的文件或目录的名称。

    • public long length():返回此File表示的文件的长度。

    判断功能的方法

    • public boolean exists():判断File表示的文件或者文件夹是否实际存在

    • public boolean isDirectory():判断此File表示的文件夹是否存在

    • public boolean isFile():判断此File表示的文件是否存在

    创建和删除文件的方法

    • public boolean createNewFile():当且仅当具有该名称的文件不存在时,创建一个新的空的文件,返回值是true

    • public boolean delete():删除由此File表示的文件或者目录

    • public boolean mkdir():创建由此File表示的文件夹

    • public boolean mkdirs():创建由此File表示的文件夹,包括任何必须但是又不存在的父目录。

    目录的遍历

    • public String[] list():返回一个String数组,表示该File目录中的所有的子目录或者子文件。

    • public File[] listFile():返回一个File数组,表示该File目录中的所有的子目录或者子文件。

    递归:指的是当前方法调用自己的一种现象。

    • 递归的分类

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

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

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

    • 注意事项

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

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

      • 构造方法禁止递归。

    使用递归打印多级目录

     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);
                }
            }
        }

    搜索:C:UsersadminDesktopHello目录中的所有的.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.FileFilter是一个接口,是File的过滤器,该接口的对象可以传递给File类的listFiles(FileFilter)作为参数,接口当中只有一个方法:

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

    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);
                }
            }
        }
    // 实现类中的代码
     @Override
    public boolean accept(File pathname) {
        if (pathname.isDirectory()) {
            return true;
        }
        return pathname.getName()
            .toLowerCase()
            .endsWith(".txt");
    }//Lambda优化
    //FilenameFilter接口
    File[] files = dir.listFiles((d,name)  -> new File(d,name).isDirectory() || name.toLowerCase().endsWith(".txt"));
    //FileFilter接口
    File[] files = dir.listFiles(pathname ->pathname.getName().toLowerCase().endsWith(".txt") || pathname.isDirectory());
  • 相关阅读:
    jmeter:dubbo接口测试
    聊聊基准测试的MVP方案
    建立团队的性能文化
    针对 Intellij IDEA 2018.2 版本 异常退出问题
    maven settings.xml配置优化
    Windows安装MySQL
    String的intern()方法详解
    Ubuntu下安装JDK图文教程详解 jdk-java6-30 .bin 的处理方法
    Iterator迭代器快捷键
    $.each $.map $.filter 区别 Script
  • 原文地址:https://www.cnblogs.com/9080dlb/p/14170621.html
Copyright © 2020-2023  润新知