Java-File

鹏北海,凤朝阳,又携书剑路茫茫

概述

  • java.io.File 类是文件和目录路径名的抽象表示,主要用于文件和目录的创建、查找和删除等操作。
  • File对象就表示一个路径,可以是文件的路径,也可以是文件夹的路径
  • 这个路径是可以存在的,也是不允许存在的

构造方法

public File(String pathname) :通过将给定的路径名字符串转换为抽象路径名来创建新的 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
// 文件路径名
String pathname = "D:\\aaa.txt";
File file1 = new File(pathname);

// 文件路径名
String pathname2 = "D:\\aaa\\bbb.txt";
File file2 = new File(pathname2);

// 通过父路径和子路径字符串
String parent = "d:\\aaa";
String child = "bbb.txt";
File file3 = new File(parent, child);

// 通过父级File对象和子路径字符串
File parentDir = new File("d:\\aaa");
String child = "bbb.txt";
File file4 = new File(parentDir, child);

成员方法

判断、获取方法

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 file;

import java.io.File;

public class FileDemo1 {
public static void main(String[] args) {

// 1.对一个文件的路径进行判断
File file1 = new File("C:\\Users\\任俊杰\\Desktop\\课设2\\小er图.png");
System.out.println(file1.isFile());
System.out.println(file1.isDirectory());
System.out.println(file1.exists());

// 2.对一个文件夹的路径进行判断
File file2 = new File("C:\\Users\\任俊杰\\Desktop\\课设2");
System.out.println(file2.isFile());
System.out.println(file2.isDirectory());
System.out.println(file2.exists());

// 3.对一个不存在的路径进行判断
File file3 = new File("C:\\Users\\任俊杰\\Desktop\\课设1");
System.out.println(file3.isFile());
System.out.println(file3.isDirectory());
System.out.println(file3.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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
package file;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;

public class FileDemo2 {
public static void main(String[] args) {

/**
* 1.length 返回文件的大小(字节数量)
* 细节1:这个方法只能获取文件的大小,单位是字节
* 如果需要的单位是G、M,可以不断地除以1024
*
* 细节2:这个方法无法获取文件夹的大小
* 如果需要获取一个文件夹的大小,需要把文件夹中里面的所有文件大小都累加在一起
*/
File f1 = new File("C:\\Users\\任俊杰\\Desktop\\课设2\\小er图.png");
long l = f1.length();
System.out.println(l);

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

/**
* 2.getAbsolutePath 返回文件的绝对路径
*/
File f2 = new File("C:\\Users\\任俊杰\\Desktop\\课设2\\小er图.png");
String path1 = f2.getAbsolutePath();
System.out.println(path1);

File f3 = new File("function\\Student.java");
String path2 = f3.getAbsolutePath();
System.out.println(path2);


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


/**
* 3.getPath 返回定义文件时使用的路径
*/
File f4 = new File("C:\\Users\\任俊杰\\Desktop\\课设2\\小er图.png");
String path3 = f4.getPath();
System.out.println(path3);

File f5 = new File("function\\Student.java");
String path4 = f5.getPath();
System.out.println(path4);

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


/*
4.getName 获取名字
*/
File f6 = new File("C:\\Users\\任俊杰\\Desktop\\课设2\\小er图.png");
String path5 = f6.getPath();
System.out.println(path5);

File f7 = new File("function\\Student.java");
String path6 = f7.getPath();
System.out.println(path6);

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


/**
* lastModified 返回文件最后修改时间(毫秒值)
*/
File f8 = new File("C:\\Users\\任俊杰\\Desktop\\课设2\\小er图.png");
long time = f8.lastModified();
Date date = new Date(time);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
String s = sdf.format(date);
System.out.println(s);


}
}

/*运行结果
149933
===============================
C:\Users\任俊杰\Desktop\课设2\小er图.png
D:\Code\Java\SE\function\Student.java
===============================
C:\Users\任俊杰\Desktop\课设2\小er图.png
function\Student.java
===============================
C:\Users\任俊杰\Desktop\课设2\小er图.png
function\Student.java
===============================
2024年06月20日 11:32:39

*/

创建、删除方法


注意:delete方法默认只能删除文件和空文件夹,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
32
33
34
35
36
37
38
39
40
41
42
package file;

import java.io.File;
import java.io.IOException;

public class FileDemo3 {
public static void main(String[] args) throws IOException {


/**
* createNewFile创建文件
* 细节1:如果当前路径表示的文件是不存在的,则创建成功,方法返回true
* 如果当前路径表示的文件是存在的,则创建失败,方法返回false
* 细节2:如果父级路径是不存在的,那么方法会有异常IOException
* 细节3:createNewFile方法创建的一定是文件,如果路径中不包含后缀名,则会创建一个没有后缀名的文件
*/
File f1 = new File("C:\\Users\\任俊杰\\Desktop\\课设2\\a.txt");
boolean b = f1.createNewFile();
System.out.println(b);


/**
* mkdir 创建文件夹(目录)
* 细节1:Windows中的路径是唯一的,如果当前创建的路径已经存在,则创建失败,返回false
* 细节2:mkdir只能创建单级目录,不能创建多级目录
*/
File f2 = new File("C:\\Users\\任俊杰\\Desktop\\课设2\\aaa");
boolean mkdir = f2.mkdir();
System.out.println(mkdir);


/**
* mkdirs 创建多级文件夹(目录)
* 细节1:可以用来创建单级、多级文件夹
*
*/
File f3 = new File("C:\\Users\\任俊杰\\Desktop\\课设2\\b\\c\\d");
boolean mkdirs = f3.mkdirs();
System.out.println(mkdirs);

}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package file;

import java.io.File;

public class FileDemo4 {
public static void main(String[] args) {

/**
* delete 删除文件、文件夹
* 细节1:delete方法删除不走回收站
* 细节2:如果删除的是文件,会直接删除
* 如果删除的是空文件夹,则直接删除
* 如果删除的是有内容的文件夹,则删除失败
*/
File f1 = new File("C:\\Users\\任俊杰\\Desktop\\课设2\\a.txt");
boolean delete = f1.delete();
System.out.println(delete);

}
}

获取并遍历方法


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package file;

import java.io.File;

public class FileDemo5 {
public static void main(String[] args) {
/**
* listFiles列出所有文件,包括隐藏的文件
*/
File f = new File("C:\\Users\\任俊杰\\Desktop\\课设2\\a.txt");
File[] files = f.listFiles();
for (File file : files) {
System.out.println(file);
}
}
}

了解:

listRoots

list

list(FilenameFilter filter)

listFiles(FileFilter filter)

listFiles(FilenameFilter filter)

综合练习

练习1:在当前模块下aaa文件夹中创建一个a.txt文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package file;

import java.io.File;
import java.io.IOException;

public class FilePractice1 {
public static void main(String[] args) throws IOException {
// 创建文件对象
File file = new File("myTest\\aaa");
// 创建文件夹
file.mkdirs();
// 拼接父子路径
File file1 = new File(file,"a.txt");
// 创建该路径文件
boolean newFile = file1.createNewFile();
if (newFile){
System.out.println("succeed");
}else System.out.println("failed");
}
}


练习2:定义一个方法,找某一个文件夹中,是否有以avi结尾的电影(暂不考虑子文件夹)

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
package file;

import java.io.File;

public class FilePractice2 {
public static void main(String[] args) {
File file = new File("myTest\\aaa");
boolean avi = FilePractice2.isAVI(file);
System.out.println(avi);

}

public static boolean isAVI(File file) {
// 获取该路径下的所有内容
File[] files = file.listFiles();
// 遍历files中的每一个文件
for (File f : files) {
// 判断是不是个文件 并且 名字的结尾是不是avi
if (f.isFile() && f.getName().endsWith(".avi")) {
return true;
}
}
return false;
}
}


练习3:找到电脑中所有以avi结尾的电影,需要考虑子文件夹

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
package file;

import java.io.File;
import java.util.Arrays;

public class FilePractice3 {
public static void main(String[] args) {
findAVI();
}

public static void findAVI(){
// 获取所有盘符
File[] roots = File.listRoots();
// System.out.println(Arrays.toString(roots));
// 循环盘符,调用findAVI方法
for (File root : roots) {
findAVI(root);
}
}


// 递归查找文件下的内容
public static void findAVI(File file) {
// 先获取入口处所有内容
File[] files = file.listFiles();
// 入口处内容有可能为空,为空不进行操作,不为空的情况下开开始遍历文件和文件夹
if (files != null) {
for (File f : files) {
// 如果是文件
if (f.isFile()){
if (f.getName().endsWith(".avi")){
System.out.println(f);
}
}else{
// 如果是文件夹
findAVI(f);
}

}

}

}
}


练习4:删除一个多级文件夹

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
package file;

import java.io.File;

public class FilePractice4 {
public static void main(String[] args) {
// 删除一个多级文件
/**
* 如果要删除有内容的文件夹
* 1.先删除文件夹中的所有内容
* 2.然后再删除文件夹本身
*/
File file = new File("C:\\Users\\任俊杰\\Desktop\\新建文件夹");
delete(file);
}

/**
* 作用:删除src文件夹
* 参数:要删除的文件夹
*
* @param src
*/
public static void delete(File src) {
// 1.先删除文件夹里面的内容
// 进入src
File[] files = src.listFiles();
// 遍历文件夹
for (File file : files) {
// 如果是文件 直接删除
if (file.isFile()) {
// 调用File的删除方法
file.delete();
}else{
// 是文件夹就再次递归删除文件夹中的内容
delete(file);
}
}
// 2.将文件夹中的内容删除后,成为空文件夹,调用File的删除方法删除本身
src.delete();
}
}


练习5:统计一个文件夹的总大小

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
package file;

import java.io.File;

public class FilePractice5 {

public static void main(String[] args) {
File file = new File("C:\\Users\\任俊杰\\Desktop\\课设2");
long l = getLen(file);
System.out.println((double) l / 1024 / 1024 + "MB");
}

/**
* 作用:统计文件夹的总大小
* 参数:要统计的文件夹
* 返回值:统计后的结果
*
* @return
*/
public static long getLen(File src) {
// 1.定义变量进行累加
long len = 0;
// 2.获取文件夹中的内容
File[] files = src.listFiles();
// 3.遍历文件夹中的内容
for (File file : files) {
// 如果是文件
if (file.isFile()) {
len += file.length();
} else {
// 如果是文件夹,需要进入文件夹继续统计,递归
len += getLen(file);
}
}
return len;
}


}


练习6:统计文件夹中每种文件的个数

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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
package file;

import java.io.File;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class FilePractice6 {

// 方法1:静态变量
// private static HashMap <String,Integer> hm = new HashMap<>();

public static void main(String[] args) {
/**
* 统计文件夹中每种文件夹的个数并打印(考虑子文件夹)
* 打印格式:
* docx:
* doc:
* sql:
* png:
*
* 需要用到 File 递归 Map集合
*/
File file = new File("C:\\Users\\任俊杰\\Desktop\\课设2");
HashMap<String, Integer> count = getCount(file);
System.out.println(count);

}

public static HashMap<String, Integer> getCount(File src) {
// 1.使用集合来存放统计数据
HashMap<String, Integer> hm = new HashMap<>();
// 2.进入文件夹
File[] files = src.listFiles();
// 3.遍历文件夹
for (File file : files) {
// 判断是否为文件
if (file.isFile()) {
// 是文件,则开始统计
/**
* 1.取出文件夹的名字
* 2.对文件夹的后缀按照.分隔,放入数组
* 3.将分隔好的后缀,放入集合中
* 如果集合中存在该后缀
* 1.对后缀进行计数
* 2.重新放入集合中
* 如果不存在后缀
* 新添加一个后缀,计数为1
*
*/
String fileName = file.getName();
String[] arr = fileName.split("\\.");
// 切分完的数组长度应该大于2,则代表是需要处理的文件
if (arr.length >= 2) {
String endName = arr[arr.length - 1];
// 判断是否存在,放入集合
if (hm.containsKey(endName)) {
// 取出当前已经存在的次数
int count = hm.get(endName);
// 重新计数,放入
count++;
hm.put(endName, count);
} else {
// 不存在就新增一个
hm.put(endName, 1);
}
}
} else {
// 如果是文件夹,继续递归
// 方法一:用静态变量,
// getCount(file);
// 方法二:用局部变量
// 定义一个sonMap。子文件中每一种文件的个数
HashMap<String, Integer> sonMap = getCount(file);
// 把遍历的子文件夹的数据统计到hm中
Set<Map.Entry<String, Integer>> entries = sonMap.entrySet();
for (Map.Entry<String, Integer> entry : entries) {
String key = entry.getKey();
Integer value = entry.getValue();
if (hm.containsKey(key)){
// 有key
Integer count = hm.get(key);
count += value;
hm.put(key,value);
}else{
// 无key
hm.put(key,value);
}
}
}
}
return hm;
}
}