Java File类和递归
File类
- File类代表操作系统的文件对象(文件、文件夹)
File类创建对象
| 方法名称 | 说明 |
|---|---|
| public File(String pathName) | 根据文件路径创建文件对象 |
| public File(String parent, String child) | 根据父路径名 字符串 和子路径名 字符串 创建文件对象 |
| public File(File parent, String child) | 根据父路径对应 文件对象 和子路径名 字符串 创建文件对象 |
- File封装的对象仅仅是一个路径名,这个路径可以是存在的,也可以是不存在
示例:
public class FileDemo01 {
public static void main(String[] args) {
File f1 = new File("E:\\A.txt"); // 假设E盘下有A.txt文件
System.out.println(f1.exists()); // true
File f2 = new File("E:\\A"); // 假设E盘下没有A文件夹
System.out.println(f2.exists()); // false
File f3 = new File("E:\\","A.txt");
System.out.println(f3.exists()); // true
File f4 = new File(new File("E:\\"),"A");
System.out.println(f4.exists()); // false
}
}
路径分为绝对路径和相对路径
绝对路径:从盘符的根目录开始,一直到具体的某个文件或文件夹
相对路径:相对于当前项目
File类常用API
判断方法
| 方法名称 | 说明 |
|---|---|
| public boolean isDirectory() | 判断此路径名表示的File是否为文件夹 |
| public boolean isFile() | 判断此路径名表示的File是否为文件 |
| public boolean exists() | 判断此路径名表示的File是否存在 |
示例:
public class FileDemo02 {
public static void main(String[] args) throws IOException {
File f1 = new File("A.txt");
System.out.println(f1.createNewFile()); // 返回值表示文件是否创建成功,文件不存在才会创建成功
File f2 = new File("A.txt");
System.out.println(f2.isFile()); // 判断是否为文件
File f3 = new File("Day03/src");
System.out.println(f3.isDirectory()); // 判断是否为文件夹
File f4 = new File("Day03/src/com/norlcyan/file/FileDemo02.java"); // 就是当前文件
System.out.println(f4.exists()); // 判断文件或文件夹是否存在
}
}
练习:
package com.norlcyan.file;
import java.io.File;
import java.util.Scanner;
public class FileTest01 {
/*
需求:键盘录入一个文件夹路径,如果输入错误就给出提示,并继续输入,直到正确为止
*/
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("请输入文件夹路径:");
String path = sc.nextLine();
File file = new File(path);
if (file.isFile()) {
System.out.println("该路径是一个文件路径,而非文件夹路径");
} else if (!file.exists()) {
System.out.println("该路径不存在");
} else if (file.isDirectory()) {
System.out.println("输入成功!!!");
break;
}
}
}
}
获取方法
| 方法名称 | 说明 |
|---|---|
| public long length() | 返回文件的大小(字节数量) 注意:如果是文件夹的话,调用该方法返回的结果是错误的 |
| public String getAbsolutePath() | 返回文件的绝对路径 |
| public String getPath() | 返回定义文件时使用的路径 |
| public String getName() | 返回文件的名称,带后缀 |
| public long lastModified() | 返回文件的最后修改时间(时间单位:毫秒值) |
示例:
public class FileDemo03 {
public static void main(String[] args) {
File f1 = new File("A.txt");
System.out.println(f1.getAbsoluteFile()); // C:\Users\Zhao\Desktop\Java Ai\Code\AdvanceCode\A.txt
File f2 = new File("C:\\Users\\Zhao\\Desktop\\Java Ai\\Code\\AdvanceCode\\A.txt");
System.out.println(f2.getName()); // A.txt
long l = f2.lastModified();
Date d = new Date(l);
System.out.println(d); // Tue Jul 29 21:34:00 CST 2025
}
}
getPath作用不大,所以了解即可
创建和删除方法
| 方法名称 | 说明 |
|---|---|
| public boolean createNewFile() | 创建一个新的空的文件 |
| public boolean mkdir() | 只能创建一级文件夹 |
| public boolean mkdirs() | 可以创建多级文件夹(也可以创建单级文件夹) |
| public boolean delete() | 删除由此抽象路径名表示的文件或空文件夹 |
返回值表示创建或删除是否成功
delete方法删除的文件是不会留存在回收站的,一定要注意数据丢失
示例:
package com.norlcyan.file;
import java.io.File;
import java.io.IOException;
public class FileDemo04 {
public static void main(String[] args) throws IOException {
File f1 = new File("Day03\\B.txt");
System.out.println(f1.createNewFile()); // true,创建成功(假设没有B.txt的文件)
File f2 = new File("Day03\\AAA");
System.out.println(f2.mkdir()); // true,创建成功(假设没有AAA文件夹)
File f3 = new File("Day03\\AAA\\BBB\\CCC");
System.out.println(f3.mkdirs()); // true,创建成功(假设没有AAA\\BBB\\CCC这样文件路径)
// mkdirs可以创建单级文件,可以创建多级文件
System.out.println(f1.delete());
}
}
遍历方法
| 方法名称 | 说明 |
|---|---|
| public File[] listFiles() | 获取当前目录下所有的一级文件对象 返回File数组 |
- 当调用者File表示的路径不存在时,返回null
- 当调用者File表示的路径是文件时,返回null
- 当调用者File表示的路径是一个空文件夹时,返回一个长度为0的数组
- 当调用者File表示的路径是需要权限才能访问的文件夹时,返回null
示例:
当前有一个文件目录:

需求是将所有.java的文件打印出来
import java.io.File;
import java.util.Objects;
public class FileDemo05 {
public static void main(String[] args) {
method();
}
public static void method() {
// 获取File对象
File file = new File("E:\\ListFileTest");
// 将File对象路径下的所有一级文件对象存储到数组中
File[] files = file.listFiles();
// 遍历数组
for (File f : Objects.requireNonNull(files)) { // 防止空指针
if (f.getName().endsWith(".java")) {
System.out.println(f.getName());
}
}
}
}
如果aaa文件下也有.java文件,想要获取的话就需要用到递归
递归
- 方法直接或间接调用本身
- 递归如果没有控制好终止条件,会出现递归死循环,导致栈内存溢出
示例:
public class RecursionDemo01 {
public static void main(String[] args) {
method(); // 当不存在终止条件时,递归死循环,最终栈内存溢出
func01();
}
public static void method() {
// 直接调用自身
method();
}
public static void func01() {
// 调用func02,func02又调用了func01,就属于间接调用
func02();
}
public static void func02() {
func01();
}
}
终止条件就是停止直接调用自身或停止间接调用自身
案例:
- 使用递归求阶乘
package com.norlcyan.recursion;
public class RecursionDemo02 {
public static void main(String[] args) {
System.out.println(factorial(5));
}
public static long factorial(int n) {
if (n == 1) {
return 1;
} else {
return n * factorial(n - 1);
}
}
}
解题思路:将大问题层层转化为一个与原问题相似的,规模更小的问题来解决

获取文件夹内所有文件
示例:
package com.norlcyan.file;
import java.io.File;
public class FileDemo06 {
public static void main(String[] args) {
File path = new File("E:\\ListFileTest");
getJavaFile(path);
}
public static void getJavaFile(File path) {
if (path == null) return; // 防止传入null
if (!path.exists()) return; // 防止路径不存在
if (!path.isDirectory()) return; // 防止传入的路径为文件而非文件夹
File[] files = path.listFiles();
if (files == null) return; // 防止listFiles方法返回null
for (File file : files) {
if (file.isFile() && file.getName().endsWith(".java")) {
System.out.println(file.getName());
} else if (file.isDirectory()){
getJavaFile(file);
}
}
}
}
删除文件夹
- delete()只能删除空文件夹
示例:
package com.norlcyan.file;
import java.io.File;
public class FileDemo07 {
public static void main(String[] args) {
File path = new File("E:\\ListFileTest _Del");
System.out.println(cleanDirectory(path));
}
public static boolean cleanDirectory(File path) {
File[] files = path.listFiles();
if (files == null) return false;// 防止listFiles方法返回null
for (File file : files) {
if (file.isFile()) {
file.delete();// 删除文件
} else{
if (file.listFiles() != null) {// 防止listFiles方法返回null
if (file.listFiles().length == 0) {// 判断是否为空文件夹
file.delete();// 删除空文件夹
} else {
cleanDirectory(file);// 递归调用
file.delete();// 调用结束,表示文件清理完成,再清理文件夹
}
}
}
}
return true;
}
}
统计文件夹大小
示例:
import java.io.File;
public class FileDemo08 {
public static void main(String[] args) {
File file = new File("E:\\Program Files");
System.out.println(getDirectoryStorage(file));
}
public static long getDirectoryStorage(File path) {
File[] files = path.listFiles();
if (files == null) return -1;
long storage = 0;
for (File file : files) {
if (file.isFile()) {
storage += file.length();
} else {
long directoryStorage = getDirectoryStorage(file);
storage += directoryStorage;
}
}
return storage;
}
}
许可协议:
CC BY 4.0