从File类开始,学习Java文件操作

2023-11-21 11:27:41 浏览数 (1)


theme: healer-readable

highlight: a11y-dark


哈喽,各位小伙伴们,你们好呀,我是喵手。

  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。

  我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。

小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!

前言

  在Java开发中,文件IO操作是常见的操作之一,而文件操作的基础就是File类。File类提供了一系列的方法来操作文件和文件夹,它是Java文件和目录路径名的抽象表示。

摘要

  在本文中,我们将会深入了解Java中的File类,探究它的应用场景、优缺点,并通过源代码解析和实际案例来演示如何使用File类。

File类

简介

在Java中,File类表示一个文件或者目录的路径。它提供了创建、删除、查询、修改文件和目录的方法。

File类的构造方法有以下几种:

  • File(String pathname):通过给定的路径名字符串创建一个新的File实例。
  • File(String parent, String child):通过给定的父路径和子路径字符串创建一个新的File实例。
  • File(File parent, String child):从给定的父抽象路径名和子路径名字符串创建一个新的File实例。

File类常用的方法包括:

  • exists():测试此抽象路径名表示的文件或目录是否存在。
  • isDirectory():测试此抽象路径名表示的文件是否为目录。
  • isFile():测试此抽象路径名表示的文件是否为标准文件。
  • createNewFile():创建此抽象路径名指定的新文件。
  • mkdir():创建此抽象路径名指定的目录。
  • list():返回一个字符串数组,命名由此抽象路径名表示的目录中的文件和目录。
  • renameTo(File dest):将此抽象路径名表示的文件重命名为指定的路径名。

源代码解析

以下是File类的源代码:

代码语言:java复制
public class File implements Serializable, Comparable<File> {
    //字段
    private final String path;
    //构造方法
    public File(String pathname) {
        if (pathname == null) {
            throw new NullPointerException();
        }
        this.path = fs.normalize(pathname);
    }
    //方法
    public boolean exists() {
        SecurityManager security = System.getSecurityManager();
        if (security != null) {
            security.checkRead(path);
        }
        return ((fs.getBooleanAttributes(this) & FileSystem.BA_EXISTS) != 0);
    }
    public boolean isDirectory() {
        SecurityManager security = System.getSecurityManager();
        if (security != null) {
            security.checkRead(path);
        }
        return ((fs.getBooleanAttributes(this) & FileSystem.BA_DIRECTORY) != 0);
    }
    public boolean isFile() {
        SecurityManager security = System.getSecurityManager();
        if (security != null) {
            security.checkRead(path);
        }
        return ((fs.getBooleanAttributes(this) & FileSystem.BA_REGULAR) != 0);
    }
    //省略其他方法
}

  可以看出,File类的实现非常简单,主要是对文件、目录的一些基本操作。实现了Serializable、Comparable<File> 接口。其中包含了一个字段path,表示文件路径。构造方法用于初始化File对象,被传入的参数pathname表示文件的路径。方法中包含了exists()、isDirectory()、isFile()等用于判断文件是否存在、是否是目录、是否是文件的方法,并通过调用FileSystem类的方法获取文件的属性进行判断。该代码还省略了其他方法。

如下是部分源码截图:

image.pngimage.png

应用场景案例

下面通过一些具体案例,来演示File类的应用场景。

创建目录

代码语言:java复制
File dir = new File("mydir");
if(!dir.exists()) {
    dir.mkdir();
}

创建文件

代码语言:java复制
File file = new File("myfile.txt");
if(!file.exists()) {
    file.createNewFile();
}

删除文件

代码语言:java复制
File file = new File("myfile.txt");
if(file.exists()) {
    file.delete();
}

列出目录下的文件和目录名

代码语言:java复制
File dir = new File("mydir");
if(dir.isDirectory()) {
    String[] files = dir.list();
    for(String fileName : files) {
        System.out.println(fileName);
    }
}

拓展:

  这段代码的作用是遍历名为"mydir"的文件夹中的所有文件,如果该文件夹存在且是文件夹类型,那么将文件夹中所有文件的文件名打印出来。

具体分析如下:

  1. 创建一个File对象dir,指定文件夹路径为"mydir"。
  2. 调用isDirectory()方法判断该File对象对应的路径是否是一个文件夹,如果是则继续执行。
  3. 调用list()方法获取该文件夹中的所有文件名,保存到一个字符串数组中。
  4. 遍历该字符串数组,对于每一个文件名,将其打印出来。

  注意:该代码并不会输出文件夹的名称,只会输出文件夹中的文件名。如果需要输出文件夹名称,可以将System.out.println(dir.getName())添加到代码中。

遍历目录下的文件和目录

代码语言:java复制
public static void traverse(File file) {
    if(file.isFile()) {
        System.out.println(file.getPath());
    } else if(file.isDirectory()) {
        File[] files = file.listFiles();
        for(File f : files) {
            traverse(f);
        }
    }
}

拓展:

此代码为遍历文件系统中的所有文件和文件夹,并打印出所有文件的路径。

  1. 定义了一个静态方法 traverse(),传入参数为 File 类型的文件对象 file
  2. 判断当前文件对象是否为文件,如果是文件,则打印出其路径。
  3. 如果不是文件,则判断其是否为文件夹,如果是文件夹,则获取该文件夹下所有文件和子文件夹,然后递归调用 traverse() 方法,对每个文件或子文件夹进行遍历操作。
  4. 当最底层的文件对象为文件时,执行步骤 2,打印出其路径,然后返回上一级执行步骤 3,继续遍历其他文件或文件夹。直到遍历完整个文件系统。

优缺点分析

优点

  • File类提供了丰富的文件和目录操作方法,方便程序员进行文件IO操作。
  • File类的使用非常简单,只要提供文件路径或文件名即可创建文件对象。
  • File类的性能较好,适用于对大文件和目录的操作。

缺点

  • File类在文件IO操作中对性能和内存的消耗较高,不适用于对大量的小文件的操作。
  • File类无法实现文件锁定和并发操作,不适用于多线程环境下的文件操作。

类代码方法介绍

以下是File类中比较重要的方法介绍:

exists()

public boolean exists()

测试此抽象路径名表示的文件或目录是否存在。

如果此抽象路径名表示的文件或目录存在,则返回 true;否则返回 false。

isDirectory()

public boolean isDirectory()

测试此抽象路径名表示的文件是否为目录。

如果此抽象路径名表示的文件为目录,则返回 true;否则返回 false。

isFile()

public boolean isFile()

测试此抽象路径名表示的文件是否为标准文件。

如果此抽象路径名表示的文件为标准文件,则返回 true;否则返回 false。

createNewFile()

public boolean createNewFile() throws IOException

创建此抽象路径名指定的新文件。

如果文件已存在,则不创建文件,并返回 false;否则创建一个新文件,返回 true。

mkdir()

public boolean mkdir()

创建此抽象路径名指定的目录。

如果目录已经存在,则不创建目录,并返回 false;否则创建一个新目录,返回 true。

list()

public String[] list()

返回一个字符串数组,命名由此抽象路径名表示的目录中的文件和目录。

如果此抽象路径名不表示一个目录,则返回 null。

renameTo()

public boolean renameTo(File dest)

将此抽象路径名表示的文件重命名为指定的路径名。

如果重命名操作成功,则返回 true;否则返回 false。

测试用例

以下是一些测试用例:

测试目录创建和删除

代码语言:java复制
public static void testDirectory() {
    //测试目录创建
    File dir = new File("mydir");
    if(!dir.exists()) {
        dir.mkdir();
    }
    //测试目录删除
    if(dir.exists()) {
        dir.delete();
    }
}

拓展:

  这段代码定义了一个静态的方法testDirectory(),用于测试目录的创建和删除。具体分析如下:

  1. 创建File对象dir,指定了目录名为"mydir"。
  2. 判断目录是否存在,如果不存在,则使用mkdir()方法创建目录。
  3. 判断目录是否存在,如果存在,则使用delete()方法删除目录。

  总体来说,这段代码主要是为了测试目录创建和删除的功能,如果目录存在,则会删除目录,如果不存在,则会创建目录。

测试文件创建和删除

代码语言:java复制
public static void testFile() throws Exception {
    //测试文件创建
    File file = new File("myfile.txt");
    if(!file.exists()) {
        file.createNewFile();
    }
    //测试文件删除
    if(file.exists()) {
        file.delete();
    }
}

拓展:

  如上代码定义了一个名为testFile的静态方法,它可能会抛出异常。方法中有以下几个步骤:

  1. 创建一个名为"myfile.txt"的File对象。
  2. 如果该文件不存在,则使用createNewFile()方法创建该文件。
  3. 如果该文件存在,则使用delete()方法删除该文件。

  可以看出,该方法的主要作用是测试文件创建和删除的功能。如果文件创建和删除正常,代码将不会抛出异常。否则,如果文件创建失败或删除失败,将会抛出异常。

测试文件重命名

代码语言:java复制
package com.example.javase.se.classes;

import java.io.File;

/**
 * @Author ms
 * @Date 2023-11-05 17:56
 */
public class FileTest {

    public static void testRename() throws Exception {
        File oldFile = new File("test.txt");
        if (!oldFile.exists()) {
            oldFile.createNewFile();
        }

        File newFile = new File("newTest.txt");
        if (oldFile.exists() && !newFile.exists()) {
            oldFile.renameTo(newFile);
        }
    }

    public static void main(String[] args) throws Exception {
        testRename();
    }
}

测试结果

  根据如上测试用例,本地测试结果如下,仅供参考,你们也可以自行修改测试用例或者添加更多的测试数据或测试方法,进行熟练学习以此加深理解。

在这里插入图片描述在这里插入图片描述

测试代码分析

  根据如上测试用例,在此我给大家进行深入详细的解读一下测试代码,以便于更多的同学能够理解并加深印象。

  这是一个简单的文件操作示例,其中包括了文件的重命名操作。具体过程如下:

  1. 首先创建一个名为"test.txt"的文件对象 oldFile。
  2. 判断该文件对象是否存在,如果不存在,则通过调用 createNewFile() 方法创建一个新文件。
  3. 创建一个名为"newTest.txt"的新文件对象 newFile,同时判断 oldFile 是否存在且 newFile 不存在。如果成立,说明可以将 oldFile 重命名为 newFile。
  4. 调用 renameTo() 方法实现重命名操作。
  5. 在 main() 方法中调用 testRename() 方法即可执行文件重命名操作。

  需要注意的是,这里的文件重命名操作是基于文件对象的,需要在同一个目录下操作。如果需要改变目录,可以先将原文件复制到新目录下,然后删除原文件。

全文小结

  本文介绍了Java中的File类,包括其基本概念、应用场景、优缺点以及常用方法的说明。通过实际案例和源码分析,我们深入了解了File类的使用方法和内部实现机制。希望本文对初学者有所帮助。

总结

  File类是Java文件和目录路径名的抽象表示,它提供了一系列的方法来操作文件和目录。在文件IO操作中,File类的使用非常广泛,对于大文件和目录的操作也具有较好的性能。但在多线程环境下的文件操作和对小文件的操作上,File类存在一些不足。

... ...

文末

好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。

... ...

学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!

wished for you successed !!!


⭐️若喜欢我,就请关注我叭。

⭐️若对您有用,就请点赞叭。

⭐️若有疑问,就请评论留言告诉我叭。

我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

0 人点赞