【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");
}
}
四、总结与选型建议
- 基础操作:使用原生 File 类,适合简单的文件 / 目录创建、判断、遍历场景。
- 随机读写:使用 RandomAccessFile,适合断点续传、大型文件局部修改等场景。
- 复杂场景:优先使用第三方工具类(FileUtils/Hutool),减少重复代码,提升开发效率。
- 若项目已引入 Apache Commons IO,直接使用 FileUtils;
- 若追求更简洁的 API 和中文文档,推荐 Hutool FileUtil。
文件操作是 Java 后端的基础技能,掌握这些类的核心用法,能轻松应对日常开发中的各类文件处理需求。如果大家有其他实用技巧或问题,欢迎在评论区交流~



