Java File 类学习笔记
1. 路径说明
-
相对路径 :当前项目下,如
"a.txt"
-
绝对路径 :完整路径,如
"D:\\a.txt"
2. File 类概述
File 对象表示一个路径,可以是文件路径,也可以是文件夹路径。这个路径可以是存在的,也可以是不存在的。
3. 构造方法
构造方法 | 说明 |
---|---|
File(String pathName) |
根据文件路径创建文件对象 |
File(String parent, String child) |
根据父路径名字符串和子路径名字符串创建文件对象 |
File(File parent, String child) |
根据父路径对应文件对象和子路径名字符串创建文件对象 |
3.1 构造方法示例
java
// 1. File(String pathName)
String path = "D:\\aaa\\a.txt";
File file = new File(path);
System.out.println(file);
// 2. File(String parent, String child)
String parent = "D:\\aaa\\";
String child = "a.txt";
File file1 = new File(parent, child);
System.out.println(file1);
// 3. File(File parent, String child)
File parentFile = new File("D:\\aaa\\");
File file2 = new File(parentFile, "a.txt");
System.out.println(file2);
4. 常见成员方法
4.1 判断方法
方法 | 说明 |
---|---|
boolean isDirectory() |
判断此路径名表示的File是否为一个文件夹 |
boolean isFile() |
判断此路径名表示的File是否为一个文件 |
boolean exists() |
判断此路径名表示的File是否存在 |
java
File file = new File("D:\\aaa\\a.txt");
System.out.println(file.isDirectory()); // false
System.out.println(file.isFile()); // true
System.out.println(file.exists()); // true
4.2 获取信息方法
方法 | 说明 | 注意事项 |
---|---|---|
long length() |
返回文件的大小(字节数量) | 1. 如果获取的是文件夹,无法获取文件夹大小 2. 单位是字节,要获得M/G需要除以1024 |
String getAbsolutePath() |
返回绝对路径 | |
String getName() |
返回文件名称,带后缀 | 调用者是文件→返回文件名和后缀名 调用者是文件夹→返回文件夹名 |
String getPath() |
返回定义文件时使用的路径 | |
long lastModified() |
返回文件的最后修改时间(时间毫秒值) |
java
File file = new File("D:\\aaa\\a.txt");
System.out.println(file.length()); // 11
System.out.println(file.getAbsolutePath()); // D:\aaa\a.txt
System.out.println(file.getName()); // a.txt
System.out.println(file.getPath()); // D:\aaa\a.txt
// 格式化最后修改时间
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String format = sdf.format(file.lastModified());
System.out.println(format); // 2025-09-03 19:05:17
4.3 创建和删除方法
方法 | 说明 | 注意事项 |
---|---|---|
boolean createNewFile() |
创建一个新的空的文件 | 1. 如果父级路径不存在,方法会有异常 IOException 2. 创建的一定是文件,如果路径中不包含后缀名,则创建一个没有后缀的文件 |
boolean mkdir() |
创建单级文件夹 | 1. Windows中路径唯一,创建文件路径不能重复 2. 只能创建单级文件夹,无法创建多级 |
boolean mkdirs() |
创建多级文件夹 | 如果已经存在,返回false |
boolean delete() |
删除文件,空文件夹 | 1. 如果删除的是文件夹,文件夹必须为空才能删除成功 2. 删除不走回收站 |
java
// 创建文件
File file4 = new File("D:\\aaa\\b.txt");
boolean newFile = file4.createNewFile();
System.out.println(newFile); // true (如果文件已经存在,返回false)
// 创建单级文件夹
File file5 = new File("D:\\aaa\\bbb");
boolean mkdir = file5.mkdir();
System.out.println(mkdir); // true
// 创建多级文件夹
File file6 = new File("D:\\aaa\\bbb\\ccc");
boolean mkdirs = file6.mkdirs();
System.out.println(mkdirs); // true (如果已经存在,返回false)
// 删除文件或空文件夹
File file7 = new File("D:\\aaa\\bbb\\ccc\\a.txt");
boolean delete = file7.delete();
System.out.println(delete);
4.4 遍历目录方法
方法 | 说明 | 注意事项 |
---|---|---|
File[] listFiles() |
获取当前路径下所有内容 | 1. 路径不存在→返回null 2. 路径是文件→返回null 3. 空文件夹→返回长度为0的数组 4. 非空文件夹→返回包含所有内容的File数组 5. 需要权限的文件夹→返回null |
static File[] listRoots() |
获取当前操作系统的根路径 | |
String[] list() |
获取当前路径下的所有内容(仅获取名字) | |
String[] list(FilenameFilter filter) |
利用文件名过滤器获取当前路径下的所有内容 | |
File[] listFiles(FileFilter filter) |
利用文件过滤器获取当前路径下的所有内容 | |
File[] listFiles(FilenameFilter filter) |
利用文件名过滤器获取当前路径下的所有内容 |
java
// 获取当前路径下所有内容
File file8 = new File("D:\\aaa");
File[] files = file8.listFiles();
for (File file9 : files) {
System.out.println(file9);
}
// 获取当前操作系统的根路径
File[] roots = File.listRoots();
for (File root : roots) {
System.out.println(root);
}
// 获取当前路径下的所有内容(仅名字)
String[] list = file8.list();
for (String s : list) {
System.out.println(s);
}
// 使用文件名过滤器
String[] list1 = file8.list(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
File src = new File(dir, name);
return src.isFile() && name.endsWith(".txt");
}
});
System.out.println(Arrays.toString(list1));
// 使用Lambda表达式简化
String[] list2 = file8.list((dir, name) -> {
File src = new File(dir, name);
return src.getName().endsWith(".txt") && src.isFile();
});
System.out.println(Arrays.toString(list2));
// 使用文件过滤器
File[] files2 = file8.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
return pathname.isFile() && pathname.getName().endsWith(".txt");
}
});
// 使用Lambda表达式简化
File[] files4 = file8.listFiles(file10 ->
file10.isFile() && file10.getName().endsWith(".txt"));
5. 练习示例
5.1 练习1:创建文件
java
// 在D盘的aaa文件夹下创建一个文件a.txt
File file11 = new File("D:\\aaa\\a.txt");
boolean newFile2 = file11.createNewFile();
System.out.println(newFile2);
5.2 练习2:查找特定文件
java
// 定义一个方法,找某一个文件夹中,是否有以avi结尾的电影
public static boolean findAvi(File src) {
File[] files = src.listFiles();
for (File file : files) {
if (file.isFile() && file.getName().endsWith(".avi")) {
return true;
}
}
return false;
}
5.3 练习3:递归查找所有特定文件
java
// 找到电脑中所有以avi结尾的电影并输出绝对路径
public static void findAvi1() {
File[] files = File.listRoots();
for (File file : files) {
findAvi1(file);
}
}
public static void findAvi1(File src) {
File[] files = src.listFiles();
if (files != null) {
for (File file : files) {
if (file.isFile()) {
String name = file.getName();
if (name.endsWith(".avi")) {
System.out.println(file.getAbsolutePath());
}
} else {
findAvi1(file);
}
}
}
}
5.4 练习4:删除多级文件夹
java
// 删除一个多级文件夹
// 1.先删除文件夹里的所有内容
// 2.再删除自己
public static void deleteDir(File src) {
File[] files = src.listFiles();
// 1.先删除文件夹里的所有内容
if (files != null) {
for (File file : files) {
if (file.isFile()) {
file.delete();
} else {
deleteDir(file);
}
}
}
// 2.再删除自己
src.delete();
}
5.5 练习5:统计文件夹大小
java
// 统计一个文件夹大小
public static long getDirSize(File src) {
File[] files = src.listFiles();
long size = 0;
for (File file : files) {
if (file.isFile()) {
size += file.length();
} else {
size += getDirSize(file);
}
}
return size;
}
5.6 练习6:统计文件类型个数
java
// 统计一个文件夹下,每个文件类型的个数
// 参数:要统计的那个文件夹
// 返回值:一个Map集合,集合的键:文件后缀名,值:文件类型的个数
public static Map<String, Integer> getCount(File src) {
Map<String, Integer> map = new HashMap<>();
File[] files = src.listFiles();
for (File file : files) {
if (file.isFile()) {
// 如果是文件,统计
String name = file.getName();
String[] split = name.split("\\.");
if (split.length >= 2) {
String endName = split[split.length - 1];
if (map.containsKey(endName)) {
// 存在
int count = map.get(endName);
count++;
map.put(endName, count);
} else {
// 不存在
map.put(endName, 1);
}
}
} else {
// 如果是文件夹,递归
// 子文件夹中统计的结果
Map<String, Integer> sonMap = getCount(file);
// 遍历累加
for (Map.Entry<String, Integer> entry : sonMap.entrySet()) {
String key = entry.getKey();
Integer value = entry.getValue();
if (map.containsKey(key)) {
// 存在
int count = map.get(key);
count += value;
map.put(key, count);
} else {
// 不存在
map.put(key, value);
}
}
}
}
return map;
}
6. 注意事项
-
Windows 中使用
\
作为路径分隔符,Linux 中使用/
-
在字符串中,
\
是转义字符,需要使用\\
表示\
-
创建文件时,如果父级路径不存在,会抛出 IOException
-
删除文件夹时,文件夹必须为空才能删除成功
-
遍历目录时,需要注意权限问题和空值判断
通过合理使用 File 类,可以方便地进行文件和目录的操作,包括创建、删除、遍历和统计等操作。