zoukankan      html  css  js  c++  java
  • 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());
  • 相关阅读:
    CREATE AGGREGATE
    技术文档列表
    jQuery 判断表单中多个 input text 中至少有一个不为空
    Java实现 蓝桥杯 算法提高 奥运会开幕式
    Java实现 蓝桥杯 算法提高 最长滑雪道
    Java实现 蓝桥杯 算法提高 最长滑雪道
    Java实现 蓝桥杯 算法提高 最长滑雪道
    Java实现 蓝桥杯 算法提高 最大值路径
    Java实现 蓝桥杯 算法提高 最大值路径
    Java实现 蓝桥杯 算法提高 最大值路径
  • 原文地址:https://www.cnblogs.com/9080dlb/p/14170621.html
Copyright © 2011-2022 走看看