File类

  • File类代表操作系统的文件对象(文件、文件夹)

File类创建对象

方法名称 说明
public File(String pathName) 根据文件路径创建文件对象
public File(String parent, String child) 根据父路径名 字符串 和子路径名 字符串 创建文件对象
public File(File parent, String child) 根据父路径对应 文件对象 和子路径名 字符串 创建文件对象
  • File封装的对象仅仅是一个路径名,这个路径可以是存在的,也可以是不存在

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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是否存在

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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()); // 判断文件或文件夹是否存在
}
}

练习:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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() 返回文件的最后修改时间(时间单位:毫秒值)

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
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方法删除的文件是不会留存在回收站的,一定要注意数据丢失

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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

示例:

当前有一个文件目录:

Snipaste_2025-07-29_22-18-18

需求是将所有.java的文件打印出来

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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文件,想要获取的话就需要用到递归

递归

  • 方法直接或间接调用本身

  • 递归如果没有控制好终止条件,会出现递归死循环,导致栈内存溢出

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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();
}
}

终止条件就是停止直接调用自身或停止间接调用自身

案例:

  1. 使用递归求阶乘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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);
}
}
}

解题思路:将大问题层层转化为一个与原问题相似的,规模更小的问题来解决

递归演示

获取文件夹内所有文件

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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()只能删除空文件夹

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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;
}
}

统计文件夹大小

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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;
}
}