File

File类

File类的概述和构造方法

File类的概述

java.io.File 类是文件和目录路径名的抽象表示,主要用于文件和目录的创建、查找和删除等操作。

File类的构造方法

  • public File(String pathname) :通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例,然后就可以用File中的方法 。

  • public File(String parent, String child) :从父路径名字符串和子路径名字符串创建新的 File实例。

  • public File(File parent, String child) :从父抽象路径名和子路径名字符串创建新的 File实例。

  • 构造举例,代码如下:

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
public class Test {
public static void main(String[] args) {
// 创建File对象表示‪H:\aaa\hb.jpg文件路径
File f1 = new File("H:\\aaa\\hb.jpg");
File f2 = new File("H:\\aaa","hb.jpg");
File parent = new File("H:\\aaa");
File f3 = new File(parent, "hb.jpg");
System.out.println(f1);
System.out.println(f2);
System.out.println(f3);

System.out.println("=========================================");
// 创建File对象表示‪H:\aaa\2020文件夹路径
File f4 = new File("H:\\aaa\\2020");
File f5 = new File("H:\\aaa","2020");
File f6 = new File(parent,"2020");
System.out.println(f4);
System.out.println(f5);
System.out.println(f6);

System.out.println("=========================================");
// 路径不存在的
File f7 = new File("H:\\aaa\\b.txt");// b.txt文件是不存在的
File f8 = new File("H:\\aaa\\2018");// 2018文件夹是不存在的
System.out.println(f7);
System.out.println(f8);
}
}

小贴士:

  1. 一个File对象代表硬盘中的一个文件或者目录。
  2. 无论该路径下是否存在文件或者目录,都不影响File对象的创建。

File类常用方法

绝对路径和相对路径

  • 绝对路径:从盘符开始的路径,这是一个完整的路径。
  • 相对路径:相对于项目目录的路径,这是一个便捷的路径,开发中经常使用。
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
public class Test {
public static void main(String[] args) {
/*
绝对路径和相对路径:
- 绝对路径:从盘符开始的路径,这是一个完整的路径。
- 相对路径:相对于项目目录的路径,这是一个便捷的路径,开发中经常使用。 掌握

生活中:你在中粮商务公园2栋605 你对象在中粮商务公园
你告诉你对象你在哪里?
绝对路径:中国广东省深圳市宝安区留仙二路中粮商务公园2栋605
相对路径:2栋605

程序中:
绝对路径:G:\szitheima104\day12\aaa\hb.jpg
相对路径:day12\aaa\hb.jpg
*/
// 绝对路径
File f1 = new File("G:\\szitheima104\\day12\\aaa\\hb.jpg");

// 相对路径
File f2 = new File("day12\\aaa\\hb.jpg");

System.out.println(f1);
System.out.println(f2);
}
}

获取功能的方法

  • public String getAbsolutePath() :返回此File的绝对路径名字符串。

  • public String getPath() :将此File转换为路径名字符串。

  • public String getName() :返回由此File表示的文件或目录的名称。

  • public long length() :返回由此File表示的文件的字节大小。 不能获取目录的字节大小。

    方法演示,代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    public class Test {
    public static void main(String[] args) {

    // 创建File对象,表示day12\aaa\hb.jpg文件的路径
    File f1 = new File("day12\\aaa\\hb.jpg");
    System.out.println("f1的绝对路径:"+f1.getAbsolutePath());// G:\szitheima104\day12\aaa\hb.jpg
    System.out.println("f1的构造路径:"+f1.getPath());// day12\aaa\hb.jpg
    System.out.println("f1的文件名:"+f1.getName());// hb.jpg
    System.out.println("f1的字节大小:"+f1.length());// 24,666 字节

    // 创建File对象,表示day12\aaa\bbb文件夹的路径
    File f2 = new File("day12\\aaa\\bbb");
    System.out.println("f2的绝对路径:"+f2.getAbsolutePath());// G:\szitheima104\day12\aaa\bbb
    System.out.println("f2的构造路径:"+f2.getPath());// day12\aaa\bbb
    System.out.println("f2的文件名:"+f2.getName());// bbb
    System.out.println("f2的字节大小:"+f2.length());// 0
    }
    }

API中说明:length(),表示文件的长度。但是File对象表示目录,则返回值未指定。

判断功能的方法

  • public boolean exists() :此File表示的文件或目录是否实际存在。
  • public boolean isDirectory() :此File表示的是否为目录。
  • public boolean isFile() :此File表示的是否为文件。

方法演示,代码如下:

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
32
33
34
35
36
37
public class Test {
public static void main(String[] args) {
/*
判断功能的方法:
- public boolean exists() :此File表示的文件或目录是否实际存在。
- public boolean isDirectory() :此File表示的是否为目录。
- public boolean isFile() :此File表示的是否为文件。
*/
// 路径真实存在
// 创建File对象,表示day12\aaa\hb.jpg文件的路径
File f1 = new File("day12\\aaa\\hb.jpg");
System.out.println("f1表示的文件是否真实存在:"+f1.exists());// true
System.out.println("f1表示的文件是否是文件夹:"+f1.isDirectory());// false
System.out.println("f1表示的文件是否是文件:"+f1.isFile());// true

System.out.println("=====================================================");

// 路径真实存在
// 创建File对象,表示day12\aaa\bbb文件夹的路径
File f2 = new File("day12\\aaa\\bbb");
System.out.println("f2表示的文件夹是否真实存在:"+f2.exists());// true
System.out.println("f2表示的文件夹是否是文件夹:"+f2.isDirectory());// true
System.out.println("f2表示的文件夹是否是文件:"+f2.isFile());// false

System.out.println("=====================================================");
// 注意:路径不真实存在,结果都是false
File f3 = new File("day12\\aaa\\b.txt");
System.out.println("f3表示的文件是否真实存在:"+f3.exists());// false
System.out.println("f3表示的文件是否是文件夹:"+f3.isDirectory());// false
System.out.println("f3表示的文件是否是文件:"+f3.isFile());// false
File f4 = new File("day12\\aaa\\ccc");
System.out.println("f4表示的文件夹是否真实存在:"+f4.exists());// false
System.out.println("f4表示的文件夹是否是文件夹:"+f4.isDirectory());// false
System.out.println("f4表示的文件夹是否是文件:"+f4.isFile());// false
}
}

创建删除功能的方法

  • public boolean createNewFile() :当且仅当具有该名称的文件尚不存在时,创建一个新的空文件。
  • public boolean delete() :删除由此File表示的文件或目录。
  • public boolean mkdir() :创建由此File表示的目录。
  • public boolean mkdirs() :创建由此File表示的目录,包括任何必需但不存在的父目录。

方法演示,代码如下:

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
public class Test {
public static void main(String[] args) throws IOException {
/*
创建删除功能的方法:
- public boolean createNewFile() :当且仅当具有该名称的文件尚不存在时,创建一个新的空文件。
- public boolean mkdir() :创建由此File表示的目录。
- public boolean mkdirs() :创建由此File表示的目录,包括任何必需但不存在的父目录。
- public boolean delete() :删除由此File表示的文件或目录。只能删除文件或者空文件夹,不能删除非空文件夹
*/
// 创建文件:
File f1 = new File("day12\\aaa\\a.txt");
System.out.println("是否创建成功:"+f1.createNewFile());

File f2 = new File("day12\\aaa\\ddd");// 创建ddd文件
System.out.println("是否创建成功:"+f2.createNewFile());

System.out.println("=======================================");

// 创建文件夹
File f3 = new File("day12\\aaa\\eee");
System.out.println("是否创建成功:"+f3.mkdir());

File f4 = new File("day12\\aaa\\fff.txt");// 创建fff.txt文件夹
System.out.println("是否创建成功:"+f4.mkdir());

File f5 = new File("day12\\aaa\\aaa\\bbb\\ccc\\ddd");
System.out.println("是否创建成功:"+f5.mkdir());// 一定是false

System.out.println("=======================================");
System.out.println("是否创建成功:"+f5.mkdirs());

System.out.println("=======================================");

// 删除文件
File f6 = new File("day12\\aaa\\a.txt");
System.out.println("是否删除成功:"+f6.delete());// true

// 删除空文件夹
File f7 = new File("day12\\aaa\\eee");
System.out.println("是否删除成功:"+f7.delete());// true

// 删除非空文件夹
File f8 = new File("day12\\aaa\\bbb");
System.out.println("是否删除成功:"+f8.delete());// false

}
}

API中说明:delete方法,如果此File表示目录,则目录必须为空才能删除。

File类遍历目录方法

  • public String[] list() :返回一个String数组,表示该File目录中的所有子文件或目录的名称。

  • public File[] listFiles() :返回一个File数组,表示该File目录中的所有的子文件或目录的路径。

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
32
33
34
35
36
37
38
39
40
41
public class Test {
public static void main(String[] args) {
/*
File类遍历目录方法:
- public String[] list() :返回一个String数组,表示该File目录中的所有子文件或子目录的名称。
- public File[] listFiles() :返回一个File数组,表示该File目录中的所有的子文件或子目录的路径。
*/
// 创建File对象,表示day12\aaa文件夹
File f = new File("day12\\aaa");
// 获取f路径下的所有子文件和子文件夹的名称
String[] arr1 = f.list();
// 循环遍历
for (String s : arr1) {
System.out.println(s);
}

System.out.println("==============================");

// 获取f路径下的所有子文件和子文件夹的路径
File[] arr2 = f.listFiles();
// 循环遍历
for (File file : arr2) {
System.out.println(file);
}

System.out.println("==============================");

// 注意:如果文件夹没有访问权限,那么返回的就是null,遍历就会报空指针异常
File f1 = new File("H:\\System Volume Information");
String[] list = f1.list();
File[] files = f1.listFiles();
System.out.println(list+","+files);// null,null
// 报异常,为了代码的健壮性,所以循环之前加一个非空判断
if (list != null) {
for (String s : list) {

}
}

}
}

小贴士:

调用listFiles方法的File对象,表示的必须是实际存在的目录,否则返回null,无法进行遍历。

递归文件搜索

需求

  • 递归输出day15\src目录中的所有.java文件的绝对路径。

分析

  1. 目录搜索,无法判断多少级目录,所以使用递归,遍历所有目录。
  2. 遍历目录时,获取的子文件,通过文件名称,判断是否符合条件。

实现

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
32
33
34
35
36
37
38
39
40
41
42
43
public class Test3_文件搜索 {
public static void main(String[] args) {
/*
需求:
输出day15\\src目录中的所有.java文件的绝对路径。
分析:
1.定义一个方法,用来获取一个目录中所有符合条件的文件(子文件,子子文件,子子子文件...)
2.在方法中,获取该目录下的所有子文件和子目录
3.在方法中,循环遍历获取到的所有字文件和子目录
4.在方法中,遍历的时候,需要判断遍历出来的是文件还是目录
5.如果是文件,就判断该文件是否以.java结尾,如果是就获取其绝对路径打印输出
6.如果是文件夹,就递归调用该方法
*/
File file = new File("day15\\src");
findFile(file);
}

/**
* 定义一个方法,用来获取一个目录中所有符合条件的文件(子文件,子子文件,子子子文件...)
* @param file
*/
public static void findFile(File file) {
// 在方法中,获取该目录下的所有子文件和子目录
File[] files = file.listFiles();

// 在方法中,循环遍历获取到的所有字文件和子目录
if (files != null) {
// 在方法中,遍历的时候,需要判断遍历出来的是文件还是目录
for (File file1 : files) {
// 如果是文件,就判断该文件是否以.java结尾,如果是就获取其绝对路径打印输出
if (file1.isFile() && file1.getName().endsWith(".java")){
System.out.println(file1.getAbsolutePath());
}
// 如果是文件夹,就递归调用该方法
if (file1.isDirectory()){
findFile(file1);
}
}
}
}

}