【Java】文件类详解:从基础操作到工具类实战

大家好,我是云扬~ 今天来跟大家深入聊聊 Java 中的文件操作核心类。在后端开发中,文件处理是高频场景,无论是配置文件读取、日志写入还是数据备份,都离不开文件类的支持。本文会从基础的 File 类入手,再到灵活的 RandomAccessFile,最后介绍两款实用的第三方工具类,全程附带代码示例,方便大家直接上手实践。

一、File 类:文件操作的基石

File 类是 Java IO 体系中处理文件和目录的基础,它主要负责文件 / 目录的元数据操作(创建、查找、删除等),但不直接处理文件内容读写—— 这部分需要配合 IO 流来完成。

1. 核心构造方法

创建 File 对象有三种常用方式,根据路径格式灵活选择:

import java.io.File;

public class FileConstructorDemo {
    public static void main(String[] args) {
        // 1. 直接传入完整路径(绝对/相对路径均可)
        File file1 = new File("D:/test/example.txt"); // 绝对路径
        File file2 = new File("./src/main/resources/config.properties"); // 相对路径(相对于项目根目录)
        
        // 2. 父路径字符串 + 子路径字符串
        File file3 = new File("D:/test", "log.txt"); // 等价于 "D:/test/log.txt"
        
        // 3. 父路径File对象 + 子路径字符串
        File parentDir = new File("D:/test");
        File file4 = new File(parentDir, "data.json"); // 等价于 "D:/test/data.json"
    }
}

2. 常用方法实战

File 类的方法可分为获取、判断、创建删除、目录遍历四大类,下面通过代码示例演示核心用法:

import java.io.IOException;

public class FileCommonMethods {
    public static void main(String[] args) throws IOException {
        File file = new File("D:/test/demo.txt");
        
        // 🔍 获取功能
        System.out.println("绝对路径:" + file.getAbsolutePath()); // D:\test\demo.txt
        System.out.println("文件名称:" + file.getName()); // demo.txt
        System.out.println("文件大小(字节):" + file.length());
        
        // ✅ 判断功能
        System.out.println("文件是否存在:" + file.exists());
        System.out.println("是否为文件:" + file.isFile());
        System.out.println("是否为目录:" + file.isDirectory());
        
        // 📁 创建与删除
        if (!file.exists()) {
            boolean isCreated = file.createNewFile(); // 创建文件
            System.out.println("文件创建成功?" + isCreated);
        }
        
        File singleDir = new File("D:/test/singleDir");
        singleDir.mkdir(); // 创建单级目录
        
        File multiDir = new File("D:/test/a/b/c");
        multiDir.mkdirs(); // 创建多级目录(父目录不存在时自动创建)
        
        // ❌ 删除(注意:删除目录时需确保目录为空)
        // file.delete(); // 删除文件
        // FileUtils.deleteDirectory(multiDir); // 后续介绍:第三方工具类删除非空目录
        
        // 📋 目录遍历
        File testDir = new File("D:/test");
        String[] fileNames = testDir.list(); // 获取目录下所有文件/目录名称
        if (fileNames != null) {
            for (String name : fileNames) {
                System.out.println("目录内容:" + name);
            }
        }
        
        File[] files = testDir.listFiles(); // 获取目录下所有文件/目录的File对象
        if (files != null) {
            for (File f : files) {
                System.out.println("完整路径:" + f.getAbsolutePath());
            }
        }
    }
}

3. 绝对路径与相对路径辨析

  • 绝对路径:从文件系统根目录开始的完整路径(如 D:/test/file.txt/home/user/logs),兼容性差但定位精准。
  • 相对路径:相对于当前工作目录的路径(如 ./resources/config.txt),灵活性高,适合项目内文件引用。

小贴士:开发中优先使用相对路径,避免因环境差异导致的路径错误。

二、RandomAccessFile:支持随机读写的利器

RandomAccessFile 是 Java 中特殊的文件操作类,它支持在文件任意位置读写,同时实现了 DataInput 和 DataOutput 接口,兼具输入输出功能,适合处理大型文件或需要随机访问的场景(如断点续传)。

1. 核心特性与构造方法

  • 支持读写模式(rw:读写;r:只读;rws/rwd:同步写入磁盘)
  • 通过文件指针控制读写位置,默认从 0 开始
import java.io.RandomAccessFile;
import java.io.IOException;

public class RandomAccessFileDemo {
    public static void main(String[] args) throws IOException {
        // 构造方法:文件路径 + 操作模式
        RandomAccessFile raf = new RandomAccessFile("D:/test/random.txt", "rw");
        
        // 写入数据
        raf.writeUTF("Hello, RandomAccessFile!");
        raf.writeInt(2026); // 写入整数
        
        // 移动文件指针到开头(读取数据前必须定位)
        raf.seek(0);
        
        // 读取数据
        String content = raf.readUTF();
        int num = raf.readInt();
        System.out.println("读取内容:" + content);
        System.out.println("读取整数:" + num);
        
        // 获取当前指针位置
        System.out.println("当前指针位置:" + raf.getFilePointer());
        
        raf.close(); // 关闭资源
    }
}

2. 经典应用:修改文件指定内容

假设需要修改文件中第 10 个字符后的内容,无需重写整个文件:

public class ModifyFileContent {
    public static void main(String[] args) throws IOException {
        RandomAccessFile raf = new RandomAccessFile("D:/test/modify.txt", "rw");
        long position = 10; // 定位到第10个字符后
        raf.seek(position);
        
        raf.writeUTF("修改后的内容"); // 覆盖写入
        raf.close();
    }
}

三、第三方工具类:简化文件操作

原生 File 类和 RandomAccessFile 在处理复杂场景(如目录复制、大文件移动)时代码繁琐,推荐使用两款成熟的第三方工具类,大幅提升开发效率。

1. Apache Commons IO – FileUtils

Apache Commons IO 是 Java 开发中常用的工具包,FileUtils 封装了大量文件操作方法,支持文件 / 目录复制、删除、移动等,无需手动处理流资源。

使用前需导入依赖(Maven)

<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.18.0</version>
</dependency>

核心方法示例

import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.IOException;

public class FileUtilsDemo {
    public static void main(String[] args) throws IOException {
        File srcFile = new File("D:/test/source.txt");
        File destFile = new File("D:/test/target.txt");
        File srcDir = new File("D:/test/sourceDir");
        File destDir = new File("D:/test/targetDir");
        
        // 复制文件(自动创建目标文件,支持覆盖)
        FileUtils.copyFile(srcFile, destFile);
        
        // 复制目录(递归复制所有子文件和子目录)
        FileUtils.copyDirectory(srcDir, destDir);
        
        // 移动文件(等价于剪切)
        FileUtils.moveFile(srcFile, new File("D:/test/moved.txt"));
        
        // 删除目录(支持删除非空目录)
        FileUtils.deleteDirectory(destDir);
        
        // 读取文件内容(UTF-8编码)
        String content = FileUtils.readFileToString(srcFile, "UTF-8");
        System.out.println("文件内容:" + content);
        
        // 写入文件内容(追加模式)
        FileUtils.writeStringToFile(destFile, "追加的内容", "UTF-8", true);
    }
}

2. Hutool – FileUtil

Hutool 是国内流行的 Java 工具包,FileUtil 类设计更简洁,API 更符合中文开发习惯,同样支持自动关闭流,无需手动处理异常。

使用前需导入依赖(Maven)

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

核心方法示例

import cn.hutool.core.io.FileUtil;
import java.io.File;

public class HutoolFileUtilDemo {
    public static void main(String[] args) {
        String srcPath = "D:/test/source.txt";
        String destPath = "D:/test/target.txt";
        
        // 复制文件(支持覆盖,父目录不存在自动创建)
        FileUtil.copy(srcPath, destPath, true);
        
        // 创建文件(父目录不存在自动创建)
        FileUtil.touch("D:/test/newFile.txt");
        
        // 读取文件内容(UTF-8编码)
        String content = FileUtil.readUtf8String(srcPath);
        System.out.println("文件内容:" + content);
        
        // 写入文件内容(覆盖模式)
        FileUtil.writeString("Hello Hutool!", destPath, "UTF-8");
        
        // 追加写入
        FileUtil.writeString("\n追加内容", destPath, "UTF-8");
        
        // 删除文件/目录(支持递归删除)
        FileUtil.del("D:/test/tempDir");
    }
}

四、总结与选型建议

  1. 基础操作:使用原生 File 类,适合简单的文件 / 目录创建、判断、遍历场景。
  2. 随机读写:使用 RandomAccessFile,适合断点续传、大型文件局部修改等场景。
  3. 复杂场景:优先使用第三方工具类(FileUtils/Hutool),减少重复代码,提升开发效率。
    • 若项目已引入 Apache Commons IO,直接使用 FileUtils;
    • 若追求更简洁的 API 和中文文档,推荐 Hutool FileUtil。

文件操作是 Java 后端的基础技能,掌握这些类的核心用法,能轻松应对日常开发中的各类文件处理需求。如果大家有其他实用技巧或问题,欢迎在评论区交流~

Tags:

发表回复

Your email address will not be published. Required fields are marked *.

*
*