Java进阶:File类

实际开发中,可以采用hutool的工具包噢
目前版本

<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.8.8</version>
</dependency>

File类的概述

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

File类的构造方法

  • public File(String pathname) :通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。
  • public File(String parent, String child) :从父路径名字符串和子路径名字符串创建新的 File实例。
  • public File(File parent, String child) :从父抽象路径名和子路径名字符串创建新的 File实例。
  • 构造举例,代码如下:
import java.io.File;

public class Test {
    public static void main(String[] args) {
        // 创建File对象表示‪H:\aaa\hb.jpg文件路径
        File f1 = new File("H:\\aaa\\hb.jpg");
        File f2 = new File("H:\\aaa","hb.jpg");
        File parent = new File("H:\\aaa");
        File f3 = new File(parent, "hb.jpg");
        System.out.println(f1);
        System.out.println(f2);
        System.out.println(f3);

        System.out.println("=========================================");
        // 创建File对象表示‪H:\aaa\2020文件夹路径
        File f4 = new File("H:\\aaa\\2020");
        File f5 = new File("H:\\aaa","2020");
        File f6 = new File(parent,"2020");
        System.out.println(f4);
        System.out.println(f5);
        System.out.println(f6);

        System.out.println("=========================================");
        // 路径不存在的
        File f7 = new File("H:\\aaa\\b.txt");// b.txt文件是不存在的
        File f8 = new File("H:\\aaa\\2018");// 2018文件夹是不存在的
        System.out.println(f7);
        System.out.println(f8);
    }
}
  1. 一个File对象代表硬盘中的一个文件或者目录。
  2. 无论该路径下是否存在文件或者目录,都不影响File对象的创建。

获取功能的方法

  • public String getAbsolutePath() :返回此File的绝对路径名字符串。
  • public String getPath() :将此File转换为路径名字符串。
  • public String getName() :返回由此File表示的文件或目录的名称。
  • public long length() :返回由此File表示的文件的字节大小。 不能获取目录的字节大小。
    方法演示,代码如下:
public class Test {
    public static void main(String[] args) {

        // 创建File对象,表示day12\aaa\hb.jpg文件的路径
        File f1 = new File("day12\\aaa\\hb.jpg");
        System.out.println("f1的绝对路径:"+f1.getAbsolutePath());// G:\java\day12\aaa\hb.jpg
        System.out.println("f1的构造路径:"+f1.getPath());// day12\aaa\hb.jpg
        System.out.println("f1的文件名:"+f1.getName());// hb.jpg
        System.out.println("f1的字节大小:"+f1.length());// 24,666 字节

        // 创建File对象,表示day12\aaa\bbb文件夹的路径
        File f2 = new File("day12\\aaa\\bbb");
        System.out.println("f2的绝对路径:"+f2.getAbsolutePath());// G:\java\day12\aaa\bbb
        System.out.println("f2的构造路径:"+f2.getPath());// day12\aaa\bbb
        System.out.println("f2的文件名:"+f2.getName());// bbb
        System.out.println("f2的字节大小:"+f2.length());// 0
    }
}

API中说明:length(),表示文件的长度。但是File对象表示目录,则返回值未指定。

判断功能的方法

  • public String getAbsolutePath() :返回此File的绝对路径名字符串。
  • public String getPath() :将此File转换为路径名字符串。
  • public String getName() :返回由此File表示的文件或目录的名称。
  • public long length() :返回由此File表示的文件的字节大小。 不能获取目录的字节大小。
    方法演示,代码如下:
import java.io.File;

public class Test {
    public static void main(String[] args) {

        // 创建File对象,表示day12\aaa\hb.jpg文件的路径
        File f1 = new File("day12\\aaa\\hb.jpg");
        System.out.println("f1的绝对路径:"+f1.getAbsolutePath());// G:\szitheima104\day12\aaa\hb.jpg
        System.out.println("f1的构造路径:"+f1.getPath());// day12\aaa\hb.jpg
        System.out.println("f1的文件名:"+f1.getName());// hb.jpg
        System.out.println("f1的字节大小:"+f1.length());// 24,666 字节

        // 创建File对象,表示day12\aaa\bbb文件夹的路径
        File f2 = new File("day12\\aaa\\bbb");
        System.out.println("f2的绝对路径:"+f2.getAbsolutePath());// G:\szitheima104\day12\aaa\bbb
        System.out.println("f2的构造路径:"+f2.getPath());// day12\aaa\bbb
        System.out.println("f2的文件名:"+f2.getName());// bbb
        System.out.println("f2的字节大小:"+f2.length());// 0
    }
}

API中说明:length(),表示文件的长度。但是File对象表示目录,则返回值未指定。

判断功能的方法

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

方法演示,代码如下:

import java.io.File;

public class Test {
    public static void main(String[] args) {
        /*
            判断功能的方法:
                - public boolean exists() :此File表示的文件或目录是否实际存在。
                - public boolean isDirectory() :此File表示的是否为目录。
                - public boolean isFile() :此File表示的是否为文件。
         */
        // 路径真实存在
        // 创建File对象,表示day12\aaa\hb.jpg文件的路径
        File f1 = new File("day12\\aaa\\hb.jpg");
        System.out.println("f1表示的文件是否真实存在:"+f1.exists());// true
        System.out.println("f1表示的文件是否是文件夹:"+f1.isDirectory());// false
        System.out.println("f1表示的文件是否是文件:"+f1.isFile());// true

        System.out.println("=====================================================");

        // 路径真实存在
        // 创建File对象,表示day12\aaa\bbb文件夹的路径
        File f2 = new File("day12\\aaa\\bbb");
        System.out.println("f2表示的文件夹是否真实存在:"+f2.exists());// true
        System.out.println("f2表示的文件夹是否是文件夹:"+f2.isDirectory());// true
        System.out.println("f2表示的文件夹是否是文件:"+f2.isFile());// false

        System.out.println("=====================================================");
        // 注意:路径不真实存在,结果都是false
        File f3 = new File("day12\\aaa\\b.txt");
        System.out.println("f3表示的文件是否真实存在:"+f3.exists());// false
        System.out.println("f3表示的文件是否是文件夹:"+f3.isDirectory());// false
        System.out.println("f3表示的文件是否是文件:"+f3.isFile());// false
        File f4 = new File("day12\\aaa\\ccc");
        System.out.println("f4表示的文件夹是否真实存在:"+f4.exists());// false
        System.out.println("f4表示的文件夹是否是文件夹:"+f4.isDirectory());// false
        System.out.println("f4表示的文件夹是否是文件:"+f4.isFile());// false
    }
}

创建删除功能的方法

  • public boolean createNewFile() :当且仅当具有该名称的文件尚不存在时,创建一个新的空文件。
  • public boolean delete() :删除由此File表示的文件或目录。
  • public boolean mkdir() :创建由此File表示的目录。
  • public boolean mkdirs() :创建由此File表示的目录,包括任何必需但不存在的父目录。

方法演示,代码如下:

import java.io.File;
import java.io.IOException;

public class Test {
    public static void main(String[] args) throws IOException {
        /*
            创建删除功能的方法:
                - public boolean createNewFile() :当且仅当具有该名称的文件尚不存在时,创建一个新的空文件。
                - public boolean mkdir() :创建由此File表示的目录。
                - public boolean mkdirs() :创建由此File表示的目录,包括任何必需但不存在的父目录。
                - public boolean delete() :删除由此File表示的文件或目录。只能删除文件或者空文件夹,不能删除非空文件夹
         */
        // 创建文件:
        File f1 = new File("day12\\aaa\\a.txt");
        System.out.println("是否创建成功:"+f1.createNewFile());

        File f2 = new File("day12\\aaa\\ddd");// 创建ddd文件
        System.out.println("是否创建成功:"+f2.createNewFile());

        System.out.println("=======================================");

        // 创建文件夹
        File f3 = new File("day12\\aaa\\eee");
        System.out.println("是否创建成功:"+f3.mkdir());

        File f4 = new File("day12\\aaa\\fff.txt");// 创建fff.txt文件夹
        System.out.println("是否创建成功:"+f4.mkdir());

        File f5 = new File("day12\\aaa\\aaa\\bbb\\ccc\\ddd");
        System.out.println("是否创建成功:"+f5.mkdir());// 一定是false

        System.out.println("=======================================");
        System.out.println("是否创建成功:"+f5.mkdirs());

        System.out.println("=======================================");

        // 删除文件
        File f6 = new File("day12\\aaa\\a.txt");
        System.out.println("是否删除成功:"+f6.delete());// true

        // 删除空文件夹
        File f7 = new File("day12\\aaa\\eee");
        System.out.println("是否删除成功:"+f7.delete());// true

        // 删除非空文件夹
        File f8 = new File("day12\\aaa\\bbb");
        System.out.println("是否删除成功:"+f8.delete());// false

    }
}

API中说明:delete方法,如果此File表示目录,则目录必须为空才能删除。

遍历目录方法

  • public String[] list() :返回一个String数组,表示该File目录中的所有子文件或目录的名称。
  • public File[] listFiles() :返回一个File数组,表示该File目录中的所有的子文件或目录的路径。
import java.io.File;

public class Test {
    public static void main(String[] args) {
        /*
            File类遍历目录方法:
                - public String[] list() :返回一个String数组,表示该File目录中的所有子文件或子目录的名称。
                - public File[] listFiles() :返回一个File数组,表示该File目录中的所有的子文件或子目录的路径。
         */
        // 创建File对象,表示day12\aaa文件夹
        File f = new File("day12\\aaa");
        // 获取f路径下的所有子文件和子文件夹的名称
        String[] arr1 = f.list();
        // 循环遍历
        for (String s : arr1) {
            System.out.println(s);
        }

        System.out.println("==============================");

        // 获取f路径下的所有子文件和子文件夹的路径
        File[] arr2 = f.listFiles();
        // 循环遍历
        for (File file : arr2) {
            System.out.println(file);
        }

        System.out.println("==============================");

        // 注意:如果文件夹没有访问权限,那么返回的就是null,遍历就会报空指针异常
        File f1 = new File("H:\\System Volume Information");
        String[] list = f1.list();
        File[] files = f1.listFiles();
        System.out.println(list+","+files);// null,null
        // 报异常,为了代码的健壮性,所以循环之前加一个非空判断
        if (list != null) {
            for (String s : list) {

            }
        }

    }
}

调用listFiles方法的File对象,表示的必须是实际存在的目录,否则返回null,无法进行遍历。

实操-- 文件搜索

需求

  • 递归输出day15\src目录中的所有.java文件的绝对路径。

分析

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

实现

public class Test3_文件搜索 {
    public static void main(String[] args) {
        /*
            需求:
                输出day15\\src目录中的所有.java文件的绝对路径。
            分析:
                1.定义一个方法,用来获取一个目录中所有符合条件的文件(子文件,子子文件,子子子文件...)
                2.在方法中,获取该目录下的所有子文件和子目录
                3.在方法中,循环遍历获取到的所有字文件和子目录
                4.在方法中,遍历的时候,需要判断遍历出来的是文件还是目录
                5.如果是文件,就判断该文件是否以.java结尾,如果是就获取其绝对路径打印输出
                6.如果是文件夹,就递归调用该方法
         */
        File file = new File("day15\\src");
        findFile(file);
    }

    /**
     * 定义一个方法,用来获取一个目录中所有符合条件的文件(子文件,子子文件,子子子文件...)
     * @param file
     */
    public static void findFile(File file) {
        // 在方法中,获取该目录下的所有子文件和子目录
        File[] files = file.listFiles();

        // 在方法中,循环遍历获取到的所有字文件和子目录
        if (files != null) {
            // 在方法中,遍历的时候,需要判断遍历出来的是文件还是目录
            for (File file1 : files) {
                // 如果是文件,就判断该文件是否以.java结尾,如果是就获取其绝对路径打印输出
                if (file1.isFile() && file1.getName().endsWith(".java")){
                    System.out.println(file1.getAbsolutePath());
                }
                // 如果是文件夹,就递归调用该方法
                if (file1.isDirectory()){
                    findFile(file1);
                }
            }
        }
    }

}