一、File类

接下来,我们要学习的知识是一个File类。但是在讲这个知识点之前,我想先和同学们聊点别的,聊完之后再回过来学习File你会更容易理解一些。

  • 先问大家一个问题,目前你写代码时存储数据,可以用哪些方案?

    答案如下图所示:可以是变量、可以是数组、可以是对象、可以是集合,但是这些数据都是存储在内存中的,计算机内存的特点: 存取数据的速度是很快的,因此通常用于记住程序正在处理的数据,以便程序能快速的运算,这样对用户的体验比较好,但内存有个问题,只要程序执行结束,或者断电了,数据就消失了。不能永久存储。

  • 有些数据想要长久保存,该怎么办呢?

    答案如下图所示:可以将数据以文件的形式存在硬盘里,即使程序结束了,断电了只要硬盘没坏,数据就会永久存在,所以在以后的开发中,有些程序需要的数据或者程序处理后的数据,如果要长久保存,就会保存在文件中,因此我们肯定要与文件经常打交道,因此Java为了方便操作文件或者文件夹,提供了一个File类。

现在要学习的File类,它就是用来表示当前系统下的文件(也可以是文件夹),File是java.io.包下的类,通过File类提供的方法可以获取当前操作系统的文件大小、判断文件是否存在、创建文件、创建文件夹等。

但是需要我们注意:File对象只能对文件本身进行操作,不能操作文件中的内容。

1.1 File对象的创建

学习File类和其他类一样,第一步是创建File类的对象。 想要创建对象,我们得看File类有哪些构造方法。

注意

File对象既可以代表文件、也可以代表文件夹。

File封装的对象仅仅是一个路径名,这个路径可以是存在的,也允许是不存在的。

下面我们演示一下,File类创建对象的代码

需求我们注意的是:路径中"\"要写成"\\", 路径中"/"可以直接用
/**
 * 目标:掌握File创建对象,代表具体文件的方案。
 */
public class FileTest1 {
    public static void main(String[] args) {
        // 创建一个File对象,指代某个具体的文件。
        // File f1 = new File("D:/resource/ab.txt");
        // File f1 = new File("D:\\resource\\ab.txt");
        // File.separator: 路径分隔符
        File f1 = new File("D:"+File.separator+"resource"+File.separator+"ab.txt");
        System.out.println(f1.length());// 文件大小(单位:字节)
​
        // 记录文件夹本身的大小(文件夹本身的信息), 不是获取所有文件的大小
        File f2 = new File("D:/resource");
        System.out.println(f2.length());
​
        // 注意:File对象可以指代一个不存在的文件路径
        File f3 = new File("D:/resource/aaaa.txt");
        System.out.println(f3.length());
        System.out.println(f3.exists()); // false
​
        // 我现在要定位的文件是在模块中,应该怎么定位呢?
        // 绝对路径:带盘符的路径
        // File f4 = new File(""D:\\Working\\F2408A\\javase\\day10_file\\src\\ab.txt");
        // 相对路径(重点):不带盘符,默认是直接去工程下寻找文件的。
        File f4 = new File("day10_file\\src\\ab.txt");
        System.out.println(f4.length());
    }
}
1. File类构建对象的方式是什么样的?File的对象可以代表哪些东西?
    File file = new File("文件/文件夹/绝对路径/相对路径");
​
2. 绝对路径和相对路径是什么意思?
    绝对路径是带盘符的。
    相对路径是不带盘符的,默认到当前工程下寻找文件。

1.2 File判断和获取方法

各位同学,刚才我们创建File对象的时候,会传递一个文件路径过来。但是File对象封装的路径是存在还是不存在,是文件还是文件夹其实是不清楚的。好在File类提供了方法可以帮我们做判断。

话不多少,直接上代码

/**
     目标:掌握File提供的判断文件类型、获取文件信息功能
 */
public class FileTest2 {
    public static void main(String[] args) {
        // 创建文件对象,指代某个文件
        File f1 = new File("D:/resource/ab.txt");
        // File f1 = new File("D:/resource/");
​
        // 判断当前文件对象,对应的文件路径是否存在,存在返回true.
        System.out.println(f1.exists());
​
        // 判断当前文件对象指代的是否是文件,是文件返回true,反之。
        System.out.println(f1.isFile());
​
        // 判断当前文件对象指代的是否是文件夹,是文件夹返回true,反之。
        System.out.println(f1.isDirectory());
​
        // 5.public String getName():获取文件的名称(包含后缀)
        System.out.println(f1.getName());
​
        // 获取文件的大小,返回字节个数
        System.out.println(f1.length());
​
        // 获取文件的最后修改时间。
        long time = f1.lastModified();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
        System.out.println(sdf.format(time));
​
        // 获取创建文件对象时,使用的路径
        File f2 = new File("D:\\resource\\ab.txt");
        File f3 = new File("day10_file\src\ab.txt");
        System.out.println(f2.getPath());
        System.out.println(f3.getPath());
​
        // 获取绝对路径
        System.out.println(f2.getAbsolutePath());
        System.out.println(f3.getAbsolutePath());
    }
}

1.3 创建和删除方法

刚才有同学问老师,我们不能不用Java代码创建一个文件或者文件夹呀?答案是有的,不光可以创建还可以删除。

注意:delete方法默认只能删除文件和空文件夹,删除后的文件不会进入回收站。

File类提供了创建和删除文件的方法,话不多少,看代码。

/**
 * 目标:掌握File创建和删除文件相关的方法。
 */
public class FileTest3 {
    public static void main(String[] args) throws Exception {
        // 创建一个新文件(文件内容为空),创建成功返回true,反之。
        File f1 = new File("D:\\resource\\abcd.txt");
        System.out.println(f1.createNewFile());
​
        // 用于创建文件夹,注意:只能创建一级文件夹
        File f2 = new File("D:\\resource\\aaa");
        System.out.println(f2.mkdir());
​
        // 用于创建文件夹,注意:可以创建多级文件夹
        File f3 = new File("D:\\resource\\bbb\\ccc\\ddd");
        System.out.println(f3.mkdirs());
​
        System.out.println("-------------");
​
        // 删除文件,或者空文件,注意:不能删除非空文件夹。
        System.out.println(f1.delete());
        System.out.println(f2.delete());
        File f4 = new File("D:\\resource\\");
        System.out.println(f4.delete());
    }
}

需要注意的是:

1.mkdir(): 只能创建单级文件夹
2.mkdirs(): 才能创建多级文件夹
3.delete(): 文件可以直接删除,但是文件夹只能删除空的文件夹,文件夹有内容删除不了。
1. 创建多级目录使用哪个方法?
    public boolean mkdirs()
2. 删除文件需要注意什么?
    可以删除文件、空文件夹。
    默认不能删除非空文件夹。

1.4 遍历文件夹方法

有人说,想获取到一个文件夹中的内容,有没有方法呀?也是有的,下面我们就学习两个这样的方法。

话不多说直接上代码,演示一下

/**
 * 目标:掌握File提供的遍历文件夹的方法。
 */
public class FileTest4 {
    public static void main(String[] args) throws Exception {
        // 获取当前目录下所有的"一级文件名称"到一个字符串数组中去返回
        File f1 = new File("E:\\胜雅教育\\Java课程\\01.JavaSE\\基础阶段");
        String[] names = f1.list();
        for (String name : names) {
            System.out.println(name);
        }
​
        System.out.println("----------------------------------");
​
        File[] files = f1.listFiles();
        for (File file : files) {
            // 获取文件的绝对路径
            System.out.println(file.getAbsolutePath());
        }
​
        System.out.println("----------------------------------");
​
        File f = new File("D:\\resource\\aaa");
        File[] files1 = f.listFiles();
        System.out.println(Arrays.toString(files1));
    }
}

这里需要注意几个问题

1. 当主调是文件,或者路径不存在时,返回null
2. 当主调是空文件夹时,返回一个长度为0的数组
3. 当主调是一个有内容的文件夹时,将里面所有一级文件和文件夹的路径放在File数组中返回
4. 当主调是一个文件夹,且里面有隐藏文件时,将里面所有文件和文件夹的路径放在File数组中返回,包含隐藏文件
5. 当主调是一个文件夹,但是没有权限访问该文件夹时,返回null
如何遍历文件夹下的文件对象,使用哪个API,有什么特点?
    public File[] listFiles()(常用)。
    只能遍历当前文件夹对象下的一级文件对象。

关于遍历文件夹的基本操作就学习完了。 但是有同学如果想要获取文件夹中子文件夹的内容,那目前还做不到。但是学习下面的递归知识就很容易做到了。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐