Skip to content

File 类与文件操作

概述

java.io.File 类用来表示文件或目录的路径,并对它们进行元数据操作(如是否存在、是文件还是目录、创建、删除、列目录等)。它不负责打开文件内容或读写数据,只做「路径 + 文件系统元数据」层面的操作,是学习 字节流字符流 之前的基础。

说明

自 Java 7 起,java.nio.file.PathFiles 提供了更现代的文件 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.separatorPaths.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() 返回 nullFile 不是目录或发生 I/O 错误时返回 null,使用前应判空。

相关链接

基于 VitePress 构建