前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >从File类开始,学习Java文件操作

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

原创
作者头像
喵手
发布2023-11-21 11:27:41
1940
发布2023-11-21 11:27:41
举报
文章被收录于专栏:Java进阶实战Java进阶实战

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.png
image.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腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 摘要
  • File类
    • 简介
      • 源代码解析
        • 应用场景案例
          • 创建目录
          • 创建文件
          • 删除文件
          • 列出目录下的文件和目录名
          • 遍历目录下的文件和目录
        • 优缺点分析
          • 优点
          • 缺点
        • 类代码方法介绍
          • exists()
          • isDirectory()
          • isFile()
          • createNewFile()
          • mkdir()
          • list()
          • renameTo()
        • 测试用例
          • 测试目录创建和删除
          • 测试文件创建和删除
          • 测试文件重命名
          • 测试结果
          • 测试代码分析
        • 全文小结
        • 总结
        • 文末
        相关产品与服务
        腾讯云代码分析
        腾讯云代码分析(内部代号CodeDog)是集众多代码分析工具的云原生、分布式、高性能的代码综合分析跟踪管理平台,其主要功能是持续跟踪分析代码,观测项目代码质量,支撑团队传承代码文化。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档