Java:File类、递归、查找文件

1、File类-概述

1)java.io.File 这个类可以表示磁盘上的一个文件/目录,可以获取文件/目录的一些属性信息:

文件/目录的名字

文件的大小

文件/目录的最后修改时间

文件/目录是否可读、是否可写

2、File类-File类的构造方法

  • public File(String pathname) :通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。(路径可以不存在)

  • public File(String parent, String child) :从父路径名字符串和子路径名字符串创建新的 File实例。

  • public File(File parent, String child) :从父抽象路径名和子路径名字符串创建新的 File实例。

    //1.构造方法:File(String pathName)
    File file1 = new File("d:\\demo03.txt");//文件名--绝对路径
    File file2 = new File("d:\\单级目录");//目录名--绝对路径
    File file3 = new File("demo02.txt");//文件名--相对路径
    File file4 = new File("d:\\jfewjfkeljfdsljfkljfksljfdkslajfdkslafjs");//不存在
    
    
    //2.构造方法:File(String parent,String child)
    File file5 = new File("d:\\", "demo03.txt");//效果同:file1
    
    //3.构造方法:File(File parent,String child)
    File file6 = new File("d:\\");
    File file7 = new File(file6, "demo03.txt");//效果同:file5和file1

3、File类-绝对路径和相对路径

1)、绝对路径:是带盘符的全路径;

2)、绝对路径:不带盘符的,从项目根目录下找;

4、File类-File类的常用方法-获取的方法

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

  • public String getPath() :返回此File对象封装的路径名字符串

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

  • public long length() :返回由此File表示的文件的长度(不能用于目录)

    public static void main(String[] args) {
      File file1 = new File("d:\\demo03.txt");//绝对路径--文件存在
      File file2 = new File("demo03.txt");//相对路径--文件不存在
    
      System.out.println("file1的绝对路径:" +file1.getAbsolutePath());
      System.out.println("file2的绝对路径:" +file2.getAbsolutePath());
    
      System.out.println("file1封装的路径:" + file1.getPath());
      System.out.println("file2封装的路径:" + file2.getPath());
    
      System.out.println("file1的文件名:" + file1.getName());
      System.out.println("file2的文件名:" + file2.getName());
    
      System.out.println("file1的文件大小:" + file1.length());
    
    }

5、File类-File类的常用方法-判断的方法

  • public boolean exists() :此File表示的文件或目录是否实际存在。

  • public boolean isDirectory() :此File表示的是否为目录。

  • public boolean isFile() :此File表示的是否为文件。

    public static void main(String[] args) {
          File file1 = new File("d:\\demo03.txt");//绝对路径--文件存在
          File file2 = new File("demo03.txt");//相对路径--文件不存在
    
          System.out.println("file1是否存在:" + file1.exists());//true
          System.out.println("file2是否存在:" + file2.exists());//false
    
          System.out.println("file1是否是目录:" + file1.isDirectory());//false
          System.out.println("file2是否是目录:" + file2.isDirectory());//false
    
          System.out.println("file1是否是文件:" + file1.isFile());//true
          System.out.println("file2是否是文件:" + file2.isFile());//false
    
          File file3 = new File("d:\\单级目录");
    
          System.out.println("file3是否存在:" + file3.exists());//true
          System.out.println("file3是否是文件:" + file3.isFile());//false
          System.out.println("file3是否是目录:" + file3.isDirectory());//true
    
      }
    }

6、File类-File类的常用方法-创建和删除的方法

  • public boolean createNewFile() :当且仅当具有该名称的文件尚不存在时,创建一个新的空文件。(创建成功返回true,创建失败,返回false)

  • public boolean delete() :删除由此File表示的文件或目录。(彻底删除,只能删除空目录和文件)

  • public boolean mkdir() :创建由此File表示的目录。(创建单级目录)

  • public boolean mkdirs() :创建由此File表示的目录,包括任何必需但不存在的父目录。(创建多级目录)

    public static void main(String[] args) throws IOException {
      File file1 = new File("demo05.txt");
    
      System.out.println("创建文件:" + file1.createNewFile());
    
      File file2 = new File("aaa");
      System.out.println("创建文件:" + file2.createNewFile());
    
      File file3 = new File("bbb");
      System.out.println("创建目录:" + file3.mkdir());
    
      File file4 = new File("demo05_2.txt");
      System.out.println("创建目录:" + file4.mkdir());
    
      File file5 = new File("demo05\\demo04\\demo03");
      System.out.println("创建多级目录:" + file5.mkdirs());
    
    
      System.out.println("删掉demo05.txt : " + file1.delete());
      System.out.println("删除空目录:" + file3.delete());//不能删除非空目录
    
    }

7、File类-练习-遍历单级目录

public File[] listFies():获取此目录下的所有文件/目录下的文件对象,并存为数组

public static void main(String[] args) {
    File file = new File("d:\\");

    File[] fileArray = file.listFiles();

    for (File f : fileArray) {
        System.out.println((f.isFile()? "文件:" : "目录:") + f.getAbsolutePath());
    }
}

注意:listFiles在以下情况下返回null:

1)、当前的File对象表示的是一个文件;

2)、当前的File对象表示的是一个系统目录;

3)、当前的File对象表示的目录不存在

如果File对象是一个存在的空目录,listFile会返回一个0长度的数组

8、递归-前奏-方法调用解析

public class Demo {
    public static void main(String[] args) {
        f1();
        System.out.println("a");
    }

    private static void f1() {
        f2();
        System.out.println("b");
    }

    private static void f2() {
        f3();
        System.out.println("c");
    }

    private static void f3() {
        System.out.println("d");
    }
}

运行结果为dcba
Java:File类、递归、查找文件_第1张图片

9、递归-递归的概念-示例-图示

递归:方法的递归调用,指方法调用自己本身

public class Demo {
    private static int count = 0;
    public static void main(String[] args) {
        f1();
    }

    private static void f1() {
        count++;
        System.out.println("f1... count = " + count);
        f1();
    }
}

Java:File类、递归、查找文件_第2张图片

注意:

1)递归的层次不能太深,否则“栈溢出”

2)、必须要有出口,否则就是“死递归”

3)、构造方法不能使用递归调用

public class Demo {
    private static int count = 0;
    public static void main(String[] args) {
        f1();
    }

    private static void f1() {
        count++;
        System.out.println("f1... count = " + count);
        if (count == 3) {
            return;//设置出口
        }
        f1();
    }
}

Java:File类、递归、查找文件_第3张图片

10、递归-练习-递归求阶乘

求阶乘:如5!=5 * 4 * 3 * 2 * 1

使用循环:

int result = 1;
for(int i = 1 ;i <= 5; i++){
    result = result * i;
}
System.out.println("结果是:" + result);

使用递归:

public static void main(String[] args){
    int num = 5;
    System.out.println(num + " 的阶乘为:" + jieCheng5(num));
    }
public static int jieCheng5(int num){
    if(num == 1){
        return 1;//出口
    }
    return num * jieCheng5(num - 1);
}

Java:File类、递归、查找文件_第4张图片

11、递归-练习-递归遍历多级目录

public class Demo {
    public static void main(String[] args) {
        //需求:将d:\\aaa2目录下所有的文件查找出来,并打印其绝对路径
        /*
            1).封装初始目录:
            ---------------递归方法--------------
            2).获取此目录下所有的子文件/子目录的File[]数组
            3).遍历数组,判断是否是文件:
                    是:打印
                    否:从步骤2 到这里形成递归
         */
        //1).封装初始目录:
        File dir = new File("d:\\aaa2");
        listFiles(dir);
    }

    private static void listFiles(File dir)         
         //2).获取此目录下所有的子文件/子目录的File[]数组
        File[] fileArray = dir.listFiles();
        //3).遍历数组,判断是否是文件:
        if (fileArray != null) {
            for (File f : fileArray) {
                if (f.isFile()) {
                    System.out.println(f.getAbsolutePath());
                }else{
                    listFiles(f);
                }
            }
        }
    }
}

12、案例-文件搜索-第一版-自过滤

public class Demo {
    public static void main(String[] args) {
        //1.封装初始目录
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入查询路径:");
        String path = sc.nextLine();
        System.out.println("请输入要搜索的后缀名(例如:avi):");
        String suffix = sc.next();

        File dir = new File(path);
        listFiles(dir,suffix);
    }

    private static void listFiles(File dir,String suffix) {
        //2.列出此目录下所有的子文件/子目录的数组
        File[] fileArray = dir.listFiles();
        //3.遍历
        if (fileArray != null) {
            for (File f : fileArray) {
                if (f.isFile() && f.getName().endsWith("." + suffix)) {
                    System.out.println(f.getAbsolutePath());
                }else{
                    listFiles(f,suffix);
                }
            }
        }
    }
}

13、案例-文件搜索-文件过滤器说明

public static void main(String[] args) {
    File f = new File("d:\\aaa2");
    File[] fileArray = f.listFiles(new FileFilter() {//过滤器
        @Override
        public boolean accept(File pathname) {//筛网--listFiles方法会将f的每个子文件/子目录都走一下这个筛网
            if (pathname.isFile() && pathname.getName().endsWith(".txt")) {
                return true;//保留--会存储到数组中
            }
            return false;//丢弃
        }
    });
    System.out.println("数组大小:" + fileArray.length);
}

14、案例-文件搜索-过滤器

public class Demo {
    public static void main(String[] args) {
        //搜索:"D:\20180903(76期)_就业班(上午)"目录下所有的.avi文件

        File dir = new File("D:\\20180903(76期)_就业班(上午)");

        listFiles(dir);
    }

    private static void listFiles(File dir) {
        File[] fileArray = dir.listFiles(new FileFilter() {
            @Override
            public boolean accept(File pathname) {
                if((pathname.isFile() && pathname.getName().endsWith(".avi")) || pathname.isDirectory()){
                return true;
            }
                return false;
        }
        });
        //遍历
        if (fileArray != null) {
            for (File f : fileArray) {
                if (f.isFile()) {
                    System.out.println(f.getAbsolutePath());
                }else{
                    listFiles(f);//递归调用
                }
            }
        }
    }
}

15、案例-文件搜索-Lambda表达式

public class Demo {
    public static void main(String[] args) {
        //搜索:"D:\20180903(76期)_就业班(上午)"目录下所有的.avi文件

        File dir = new File("D:\\20180903(76期)_就业班(上午)");

        listFiles(dir);
    }

    private static void listFiles(File dir) {
        File[] fileArray = dir.listFiles((File pathname) -> {
                if((pathname.isFile() &&                    
                    pathname.getName().endsWith(".avi")) 
                    || pathname.isDirectory()){
                    return true;
                }
                return false;
            }
        );
        //遍历
        if (fileArray != null) {
            for (File f : fileArray) {
                if (f.isFile()) {
                    System.out.println(f.getAbsolutePath());
                }else{
                    listFiles(f);//递归调用
                }
            }
        }
    }
}

复习

  • [ ] 能够说出File对象的创建方式

    File file = new File("路径");
    File file = new File("父路径","子路径");
    File parent = new File("父路径");
    File file = new File(parent,"子路径");
  • [ ] 能够说出File类获取名称的方法名称

    getName();
  • [ ] 能够说出File类获取绝对路径的方法名称

    getAbsolutePath();//获取绝对路径
    getPath();//获取封装的文件路径
  • [ ] 能够说出File类获取文件大小的方法名称

    length();
  • [ ] 能够说出File类判断是否是文件的方法名称

    isFile();
  • [ ] 能够说出File类判断是否是文件夹的方法名称

    isDirectory();
  • [ ] 能够辨别相对路径和绝对路径

    绝对路径:从盘符开始的路径

    相对路径:从当前文件夹开始

  • [ ] 能够遍历文件夹

    File file = new File("路径");
    File[] fileArray = file.listFile();
    for(File f:fileArray){
      System.out.println(f.getAbsolutePath(););
    }
  • [ ] 能够解释递归的含义

    方法自己调用自己

  • [ ] 能够使用递归的方式计算5的阶乘

    Scanner scanner = new Scanner(System.in);
    int num = scanner.nextInt();
    System.out.println(num+"的阶乘为:"+jianCheng(num));
    
    public int jianCheng(int num){
      if(num == 1){
          return 1;
      }else{
          return num * janCheng(num - 1);
      }
    }
  • [ ] 能够说出使用递归会内存溢出隐患的原因

    没有出口的递归,一直压栈,没有弹栈

你可能感兴趣的:(Java)