在 Java IO 编程中,java.io.File类是操作文件和目录的基础 —— 它并不直接处理文件内容,而是用于描述文件或目录的路径信息,并提供判断、创建、删除、遍历等路径级操作。本文将全面梳理 File 类的核心概念、常用 API 及实战用法,助力掌握文件系统的基础操作逻辑。
一、File 类核心认知:什么是 File?
File 类的核心作用是 “封装文件或目录的路径”,它既可以表示已存在的文件 / 目录,也可以表示不存在的路径(用于后续创建)。理解 File 类的关键在于掌握 “路径” 的表示方式与 File 对象的创建方法。
1. 路径的两种表示形式
在 File 类中,路径分为 “绝对路径” 和 “相对路径”,二者适用场景不同:
- 绝对路径:从文件系统根目录(如 Windows 的C:\、D:\,Linux 的/)开始的完整路径,具有唯一性。
示例:D:\aaa\book.txt、/home/user/doc.pdf。
- 相对路径:从 “当前工作目录”(通常是项目根目录)开始的路径,简洁但依赖运行环境。
示例:a.txt(项目根目录下的 a.txt)、src/main/java/Test.java(项目内的相对路径)。
注意:Windows 系统中路径分隔符可使用\(需转义为\\)或/(推荐,跨平台兼容);Linux/Mac 系统仅支持/。
2. File 对象的三种创建方式
File 类提供了三个常用构造方法,可根据不同路径组合创建 File 对象,对应LearnFile.java中的示例:
(1)根据完整路径创建
直接传入绝对路径或相对路径字符串,创建 File 对象:
// 绝对路径:表示D盘aaa目录下的book.txt
File f1 = new File("d:/aaa/book.txt");
// 相对路径:表示项目根目录下的a.txt
File f2 = new File("a.txt");
(2)根据 “父路径 + 子路径” 创建
将路径拆分为 “父路径字符串” 和 “子路径字符串”,适用于路径动态拼接的场景:
// 父路径:d:/aaa,子路径:book.txt → 组合为d:/aaa/book.txt
File f3 = new File("d:/aaa", "book.txt");
(3)根据 “父路径 File 对象 + 子路径” 创建
父路径以 File 对象形式传入,子路径为字符串,灵活性更高(可先对父路径进行判断 / 操作):
// 父路径File对象:d:/aaa
File parent = new File("d:/aaa");
// 子路径:book.txt → 组合为d:/aaa/book.txt
File f4 = new File(parent, "book.txt");
二、File 类常用 API(一):判断与获取路径信息
File 类提供了一系列方法用于判断路径属性(如是否为文件 / 目录、是否存在)和获取路径信息(如绝对路径、文件大小),是路径操作的基础。
1. 核心判断方法
| 方法签名 | 功能描述 | 示例场景 |
| boolean isDirectory() | 判断当前路径是否为目录 | 区分 “文件夹” 和 “文件” |
| boolean isFile() | 判断当前路径是否为文件 | 同上 |
| boolean exists() | 判断当前路径是否存在 | 创建文件前检查路径是否已存在 |
示例:
File f = new File("d:/aaa/book.txt");
System.out.println("是否为目录:" + f.isDirectory()); // 输出:false
System.out.println("是否为文件:" + f.isFile()); // 输出:true(若文件存在)
System.out.println("路径是否存在:" + f.exists()); // 输出:true(若文件存在)
2. 核心获取方法
| 方法签名 | 功能描述 | 注意事项 |
| long length() | 获取文件大小(单位:字节) | 仅对文件有效,目录返回 0 |
| String getAbsolutePath() | 获取绝对路径 | 无论创建时用绝对 / 相对路径,均返回完整路径 |
| String getPath() | 获取创建 File 对象时使用的路径 | 与构造方法传入的路径一致 |
| String getName() | 获取文件名(含后缀)或目录名 | 如book.txt、aaa |
| long lastModified() | 获取最后修改时间(时间戳,毫秒级) | 需转换为Date对象才易读 |
示例:
File f = new File("d:/aaa/book.txt");
System.out.println("文件大小(字节):" + f.length()); // 输出:如1024(1KB)
System.out.println("绝对路径:" + f.getAbsolutePath()); // 输出:d:/aaa/book.txt
System.out.println("构造时路径:" + f.getPath()); // 输出:d:/aaa/book.txt
System.out.println("文件名:" + f.getName()); // 输出:book.txt
// 转换最后修改时间为易读格式
long time = f.lastModified();
Date date = new Date(time);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("最后修改时间:" + sdf.format(date)); // 输出:2025-09-03 15:30:00
三、File 类常用 API(二):创建与删除文件 / 目录
File 类提供了创建文件、创建目录、删除路径的方法,需注意不同方法的适用场景与细节限制。
1. 核心创建方法
| 方法签名 | 功能描述 | 关键细节 |
| boolean createNewFile() | 创建新的空文件 | 1. 路径不存在则创建,返回 true;2. 路径已存在返回 false;3. 父目录不存在则抛IOException |
| boolean mkdir() | 创建单级目录 | 父目录必须存在,否则创建失败(返回 false) |
| boolean mkdirs() | 创建多级目录 | 父目录不存在时会自动创建,推荐使用 |
示例:
// 1. 创建空文件(需处理IOException)
File file = new File("d:/aaa/b.txt");
boolean isCreated = file.createNewFile();
System.out.println("文件创建成功?" + isCreated); // 首次创建返回true
// 2. 创建单级目录(父目录d:/aaa必须存在)
File dir1 = new File("d:/aaa/bbb");
System.out.println("单级目录创建成功?" + dir1.mkdir()); // 成功返回true
// 3. 创建多级目录(父目录d:/aaa/ccc不存在也会自动创建)
File dir2 = new File("d:/aaa/ccc/ddd/eee");
System.out.println("多级目录创建成功?" + dir2.mkdirs()); // 成功返回true
2. 核心删除方法:boolean delete()
delete()方法可删除文件或空目录,需特别注意其不可逆性(删除后无法恢复),且有严格限制:
- 删除文件:直接删除,无论文件是否为空;
- 删除目录:仅能删除空目录,若目录中有文件或子目录,删除失败(返回 false);
- 返回值:删除成功返回 true,失败返回 false。
示例:
// 删除文件(成功返回true)
File file = new File("d:/aaa/b.txt");
System.out.println("文件删除成功?" + file.delete());
// 删除空目录(成功返回true)
File dir1 = new File("d:/aaa/bbb");
System.out.println("空目录删除成功?" + dir1.delete());
// 删除非空目录(失败返回false)
File dir2 = new File("d:/aaa/ccc"); // 包含ddd/eee子目录
System.out.println("非空目录删除成功?" + dir2.delete()); // 输出:false
四、File 类常用 API(三):遍历与筛选目录内容
当需要获取目录下的所有文件 / 子目录时,File 类提供了遍历方法;结合 “过滤器”,还可按条件筛选内容(如仅获取.txt 文件)。
1. 核心遍历方法
File 类提供了 4 种遍历目录的方法,分别返回字符串数组(仅名称)或 File 数组(完整路径):
| 方法签名 | 功能描述 | 返回值类型 |
| static File[] listRoots() | 列出系统所有根目录(如 C:\、D:\) | File[] |
| String[] list() | 获取目录下所有文件 / 子目录的名称 | String[] |
| File[] listFiles() | 获取目录下所有文件 / 子目录的File 对象 | File [](推荐,可进一步操作) |
关键注意事项(遍历方法的返回值规则):
- 若目录不存在或是文件,返回null;
- 若目录为空,返回长度为 0 的数组;
- 若目录有内容,返回包含所有文件 / 子目录的数组(含隐藏文件);
- 若目录无权限访问,返回null。
示例:
// 1. 列出系统根目录(如Windows的C:\、D:\)
File[] roots = File.listRoots();
System.out.println("系统根目录:" + Arrays.toString(roots)); // 输出:[C:\, D:\, ...]
// 2. 遍历目录,返回文件/子目录名称(字符串数组)
File dir = new File("d:/aaa");
String[] names = dir.list();
System.out.println("目录下所有名称:" + Arrays.toString(names)); // 如[book.txt, ccc]
// 3. 遍历目录,返回File对象(推荐,可调用isFile()等方法)
File[] files = dir.listFiles();
for (File f : files) {
if (f.isFile()) {
System.out.println("文件:" + f.getName());
} else {
System.out.println("目录:" + f.getName());
}
}
2. 筛选目录内容:使用过滤器
当只需获取符合条件的内容(如仅.txt 文件、仅目录)时,可使用 “文件名过滤器” 或 “文件过滤器”,本质是通过匿名内部类实现筛选逻辑。
(1)文件名过滤器:FilenameFilter
筛选逻辑基于 “目录对象” 和 “文件 / 目录名称”,返回String[](仅名称):
File dir = new File("d:/aaa");
// 筛选:仅获取后缀为.txt的文件
String[] txtNames = dir.list(new FilenameFilter() {
@Override
// dir:当前目录对象;name:当前文件/目录名称
public boolean accept(File dir, String name) {
// 1. 先通过dir和name创建File对象,判断是否为文件;
// 2. 再判断名称是否以.txt结尾
File f = new File(dir, name);
return f.isFile() && name.endsWith(".txt");
}
});
System.out.println("目录下的.txt文件:" + Arrays.toString(txtNames));
(2)文件过滤器:FileFilter
筛选逻辑直接基于 “File 对象”,返回File[](完整路径),更灵活(可直接调用 File 的方法):
File dir = new File("d:/aaa");
// 筛选:仅获取后缀为.txt的文件
File[] txtFiles = dir.listFiles(new FileFilter() {
@Override
// pathname:目录下的每个File对象
public boolean accept(File pathname) {
// 直接通过File对象判断:是否为文件 + 名称以.txt结尾
return pathname.isFile() && pathname.getName().endsWith(".txt");
}
});
System.out.println("目录下的.txt文件(File对象):" + Arrays.toString(txtFiles));
(3)过滤器的 Lambda 简化写法
JDK8 及以上版本可使用 Lambda 表达式简化过滤器代码(接口仅含一个抽象方法时):
// FileFilter的Lambda简化
File[] txtFiles = dir.listFiles(pathname ->
pathname.isFile() && pathname.getName().endsWith(".txt")
);
五、File 类实战注意事项
- 异常处理:createNewFile()方法会抛出IOException,必须通过try-catch捕获或throws声明,否则无法编译;
- 路径兼容性:优先使用/作为路径分隔符(如d:/aaa),避免\的转义问题,保证跨平台兼容;
- 删除限制:delete()无法删除非空目录,若需删除整个目录树,需递归删除所有子文件和子目录;
- 空指针风险:遍历目录前需先通过exists()和isDirectory()判断路径有效性,避免返回null导致的NullPointerException;
- 隐藏文件:listFiles()会包含隐藏文件,若需排除,可在过滤器中添加!pathname.isHidden()判断。
六、核心知识点总结
- File 类本质:封装文件 / 目录的路径,不处理文件内容,仅操作路径;
- 路径类型:绝对路径(唯一,从根目录开始)、相对路径(简洁,从当前工作目录开始);
- 核心功能:
- 判断获取:isFile()、isDirectory()、length()、getAbsolutePath();
- 创建删除:createNewFile()、mkdirs()、delete();
- 遍历筛选:listFiles()、FilenameFilter、FileFilter;
- 关键避坑:创建文件前确保父目录存在,删除目录前确保目录为空,遍历前判断路径有效性。
File 类是 Java IO 的基础,掌握其 API 与使用细节,能为后续文件内容读写(如字节流、字符流)打下坚实基础。在实际开发中,需结合业务场景灵活运用路径判断、创建、遍历等操作,同时注意异常处理与跨平台兼容性。
1123

被折叠的 条评论
为什么被折叠?



