File 类与文件操作
概述
java.io.File 类用来表示文件或目录的路径,并对它们进行元数据操作(如是否存在、是文件还是目录、创建、删除、列目录等)。它不负责打开文件内容或读写数据,只做「路径 + 文件系统元数据」层面的操作,是学习 字节流、字符流 之前的基础。
说明
自 Java 7 起,java.nio.file.Path 与 Files 提供了更现代的文件 API,推荐新代码优先使用。但 File 仍大量存在于现有项目和 API 中,掌握它仍然必要。详见 NIO 简介。
基本用法
构造 File 对象
File 的构造方法接受路径字符串或「父路径 + 子路径」:
java
// 通过完整路径字符串
File f1 = new File("/tmp/data.txt");
File f2 = new File("config/app.properties"); // 相对路径
// 父路径 + 子路径(便于跨平台拼接)
File dir = new File("/tmp");
File file = new File(dir, "data.txt"); // 等价于 /tmp/data.txt
// 或使用两个字符串
File f3 = new File("/tmp", "logs/app.log");路径可以是绝对路径或相对路径(相对于当前工作目录)。File 在内部会根据操作系统使用正确的分隔符。
路径分隔符与跨平台
不同系统路径分隔符不同:Windows 使用 \,Linux/macOS 使用 /。应避免在代码中硬编码分隔符。
java
// 使用 File.separator 或 File.separatorChar 保持跨平台
String path = "data" + File.separator + "config.txt";
File f = new File(path);
// 或直接使用正斜杠 "/":在 Windows 上 File 也能正确解析
File f2 = new File("data/config.txt");提示
在 Java 中,路径字符串里使用正斜杠 / 在 Windows 上通常也能被 File 正确识别,但若从系统属性等处拼路径,更稳妥的方式是使用 File.separator 或 Paths.get(...)(NIO)。
常用方法概览
| 方法 | 说明 |
|---|---|
exists() | 文件或目录是否存在 |
isFile() | 是否为普通文件(且存在) |
isDirectory() | 是否为目录(且存在) |
createNewFile() | 创建空文件(若不存在),返回是否成功 |
mkdir() | 创建单级目录(父目录须已存在) |
mkdirs() | 创建多级目录(缺失的父目录一并创建) |
delete() | 删除文件或空目录,返回是否成功 |
list() | 返回目录下文件名数组(String[]),非目录返回 null |
listFiles() | 返回目录下 File 数组(File[]),非目录返回 null |
getAbsolutePath() | 获取绝对路径字符串 |
getName() | 获取文件名或最后一级目录名 |
length() | 文件长度(字节数),目录返回值未定义 |
canRead() / canWrite() | 是否可读 / 可写 |
使用示例
示例 1:判断存在与类型,并创建文件
java
import java.io.File;
import java.io.IOException;
public class FileBasicDemo {
public static void main(String[] args) throws IOException {
File f = new File("data/hello.txt");
if (!f.exists()) {
// 父目录可能不存在,先创建多级目录
File parent = f.getParentFile();
if (parent != null && !parent.exists()) {
parent.mkdirs();
}
boolean created = f.createNewFile();
System.out.println("文件是否创建成功: " + created);
}
System.out.println("是否存在: " + f.exists());
System.out.println("是文件: " + f.isFile());
System.out.println("是目录: " + f.isDirectory());
System.out.println("绝对路径: " + f.getAbsolutePath());
}
}示例 2:创建多级目录
java
File dir = new File("output/2026/reports");
// mkdir() 只能创建当前一级,父目录必须已存在
// mkdirs() 会创建所有不存在的父目录
boolean ok = dir.mkdirs();
if (ok) {
System.out.println("目录创建成功: " + dir.getAbsolutePath());
} else {
// 可能已存在或权限不足
System.out.println("目录已存在或创建失败");
}示例 3:遍历目录下的文件与子目录
java
File dir = new File("/tmp");
if (!dir.isDirectory()) {
System.out.println("不是目录或不存在");
return;
}
// list() 只返回名称;listFiles() 返回 File 数组,便于继续判断类型
File[] children = dir.listFiles();
if (children != null) {
for (File child : children) {
String type = child.isDirectory() ? "[目录]" : "[文件]";
System.out.println(type + " " + child.getName());
}
}示例 4:路径拼接与常用信息
java
File base = new File("/app");
File config = new File(base, "conf/settings.properties");
System.out.println("文件名: " + config.getName()); // settings.properties
System.out.println("父目录: " + config.getParent()); // /app/conf
System.out.println("文件大小(字节): " + config.length()); // 若为文件则有意义注意事项
注意
File 对象仅代表路径,创建 new File("a.txt") 并不会在磁盘上创建文件。创建文件需调用 createNewFile(),创建目录需调用 mkdir() 或 mkdirs()。
注意
delete() 只能删除空目录。若目录非空,需先递归删除其中的文件和子目录,再删除该目录。且删除可能因权限或文件被占用而失败,应根据返回值判断。
注意
对不存在的路径调用 isFile() 或 isDirectory() 会返回 false,因此先判断 exists() 再根据业务判断类型,避免把「不存在」误当成「存在但不是文件」。
| 易错点 | 说明 |
|---|---|
| 路径中的空格与特殊字符 | 路径中包含空格或中文时,确保字符串正确;在命令行参数中要注意引号。 |
| 相对路径的「当前目录」 | 相对路径依赖 JVM 启动时的当前工作目录(如 java -jar app.jar 时的工作目录),不是 class 所在目录。 |
| list() / listFiles() 返回 null | 当 File 不是目录或发生 I/O 错误时返回 null,使用前应判空。 |
相关链接
- 字节流 — 使用
InputStream/OutputStream读写文件内容 - 字符流 — 使用
Reader/Writer按字符处理文本 - NIO 简介 —
Path与Files的现代文件 API - Oracle Java 教程 - File I/O