文件操作
# 文件操作
# 1. 什么是文件
计算机文件、文件(英语:computer file,台湾叫作电脑档案、档案)是存储在某种长期储存设备或临时储存装置中的一段数据流,并且归属于计算机文件系统管理之下。所谓“长期储存设备”一般指磁盘 (opens new window)、光盘 (opens new window)、磁带 (opens new window)等。而“短期存储装置”一般指 电脑记忆体 (opens new window)。需要注意的是,储存于长期存储装置的文件不一定是长期储存的,有些也可能是程序或系统运行中产生的临时数据,并于程序或系统退出后删除。
# 2. Java中的文件类File
在Java中,File
类是java.io
包提供的一个用于表示文件(文件和目录)的类。它不能访问文件内容本身,如果需要访问文件内容,则需要使用输入/输出流。 File
类提供了多种方法,可以用来创建、删除、重命名文件和目录,以及查询文件的属性等。
File
类定义了一系列的方法来操作文件系统,包括但不限于:
- 文件/目录检查
exists()
: 检查文件或目录是否存在。isDirectory()
: 检查File
对象是否代表一个目录。isFile()
: 检查File
对象是否代表一个文件。
- 文件/目录创建与删除
createNewFile()
: 创建一个新的空文件,如果文件已存在则不创建。delete()
: 删除文件或目录。deleteOnExit()
: 在虚拟机终止时,请求删除此抽象路径名表示的文件或目录。mkdir()
: 创建由此File
对象表示的目录。mkdirs()
: 创建由此File
对象表示的目录,包括任何必需但不存在的父目录。
- 文件/目录信息获取
getName()
: 获取文件或目录的名称。getPath()
: 返回File
对象的路径。getAbsolutePath()
: 返回File
对象的绝对路径。getCanonicalPath()
: 返回File
对象的规范路径。getParent()
: 返回File
对象的父目录路径。
- 文件列表获取
list()
: 返回一个字符串数组,这些字符串指定此File
对象表示的目录中的文件和目录。listFiles()
: 返回一个File
数组,这些File
对象表示此File
对象表示的目录中的文件和目录。
- 权限检查
canRead()
: 检查应用程序是否可以读取此File
对象表示的文件。canWrite()
: 检查应用程序是否可以修改此File
对象表示的文件。
路径说明
- 绝对路径:从根目录或驱动器开始的完整路径,如
C:\myfolder\myfile.txt
或/home/user/myfile.txt
。 - 相对路径:相对于当前工作目录的路径,如
./myfile.txt
表示当前目录下的myfile.txt
文件,../parentfolder/myfile.txt
表示上一级目录下的parentfolder
目录中的myfile.txt
文件。
# 3. File 类的构造方法
File
类提供了三种构造方法来创建其对象,分别是:
- File(String path):根据路径名(可以是文件或目录的路径)创建一个新的
File
对象。 - File(String parent, String child):根据指定的父路径名和子路径名(文件/目录名)创建一个新的
File
对象。 - File(File parent, String child):根据父File对象和子路径名(文件/目录名)创建一个新的
File
对象。
// 通过路径创建 File 对象,支持相对路径和绝对路径
File file1 = new File("C:\\example\\test.txt");
// 通过父路径和子路径创建 File 对象
File file2 = new File("C:\\example", "test.txt");
// 通过父 File 对象和子路径创建 File 对象
File parentDir = new File("C:\\example");
File file3 = new File(parentDir, "test.txt");
2
3
4
5
6
7
8
9
注意事项
使用File
类可以方便地对文件系统进行操作,但是要注意的是,File
类的很多操作都可能抛出异常,比如IOException
,因此在使用时需要进行相应的异常处理。
# 4. File 类的常用方法
# 1. 文件/目录检查相关方法
这些方法用于判断文件或目录是否存在、是否为目录或文件等。
exists()
: 检查文件或目录是否存在。- 作用: 在操作文件或目录之前,通常需要先判断它们是否存在,避免操作异常。
- 返回值:
boolean
,存在返回true
,否则返回false
。 - 场景: 在读取配置文件、处理用户上传文件等场景下,通常需要先检查文件是否存在。
isDirectory()
: 检查File
对象是否代表一个目录。- 作用: 判断路径是否为目录,用于进一步操作如遍历子目录。
- 返回值:
boolean
,是目录返回true
,否则返回false
。
isFile()
: 检查File
对象是否代表一个文件。- 作用: 判断路径是否为文件,用于具体文件的读写操作。
- 返回值:
boolean
,是文件返回true
,否则返回false
。
import java.io.File;
public class FileCheckExample {
public static void main(String[] args) {
// 目标文件路径(可以是绝对路径或相对路径)
File file = new File("C:\\example\\test.txt");
// 检查文件是否存在,避免操作不存在的文件导致异常
if (file.exists()) {
System.out.println("文件存在");
// 判断路径是文件还是目录,方便后续操作
if (file.isFile()) {
System.out.println("这是一个文件,文件名为:" + file.getName());
} else if (file.isDirectory()) {
System.out.println("这是一个目录,目录名为:" + file.getName());
}
} else {
System.out.println("文件不存在,请确认路径:" + file.getAbsolutePath());
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
输出效果:
文件存在
这是一个文件,文件名为:test.txt
2
# 2. 文件/目录创建与删除相关方法
这些方法用于创建新文件或目录、递归创建多层目录、删除文件或空目录等。
createNewFile()
: 创建一个新的空文件,如果文件已存在则不创建。- 作用: 用于在磁盘中创建新文件。
- 返回值:
boolean
,创建成功返回true
,如果文件已存在则返回false
。 - 异常: 可能抛出
IOException
,需要捕获并处理。 - 场景: 当需要创建日志文件、配置文件等时使用。
mkdir()
: 创建由此File
对象表示的目录。- 作用: 用于创建单层目录。
- 返回值:
boolean
,成功返回true
,失败返回false
。
mkdirs()
: 创建由此File
对象表示的目录,包括任何必需但不存在的父目录。- 作用: 用于递归创建多层目录。
- 返回值:
boolean
,成功返回true
,失败返回false
。 - 场景: 当需要创建多层嵌套的目录结构时使用,例如上传文件时按照日期自动分目录。
delete()
: 删除文件或目录。注意:只能删除空目录。- 作用: 删除指定路径的文件或目录。
- 返回值:
boolean
,成功返回true
,失败返回false
。 - 场景: 清理临时文件、删除旧的日志文件等。
import java.io.File;
import java.io.IOException;
public class FileCreateDeleteExample {
public static void main(String[] args) {
// 目标文件路径,包含多级目录
File file = new File("C:" + File.separator + "example" + File.separator + "a" + File.separator + "b" + File.separator + "test.txt");
// Step 1: 创建新文件前,先检查父级目录是否存在,如果不存在则先创建父级目录
try {
// 获取父级目录
File parentDir = file.getParentFile();
if (!parentDir.exists()) {
// 如果父级目录不存在,先创建父级目录
if (parentDir.mkdirs()) {
System.out.println("父级目录创建成功:" + parentDir.getAbsolutePath());
} else {
System.err.println("父级目录创建失败,请检查路径或权限:" + parentDir.getAbsolutePath());
return; // 如果父级目录创建失败,直接返回,避免后续创建文件时报错
}
}
// 检查目标文件是否已存在,避免重复创建
if (!file.exists()) {
boolean created = file.createNewFile(); // 创建新文件
if (created) {
System.out.println("文件创建成功:" + file.getAbsolutePath());
} else {
System.err.println("文件创建失败:" + file.getAbsolutePath());
}
} else {
System.out.println("文件已存在,无需创建:" + file.getAbsolutePath());
}
} catch (IOException e) {
// 捕获并处理可能出现的 IO 异常
System.err.println("创建文件时发生错误:" + e.getMessage());
}
// Step 2: 创建多层目录示例,先检查目录是否存在
File multiLevelDir = new File("C:" + File.separator + "example" + File.separator + "x" + File.separator + "y" + File.separator + "z");
if (!multiLevelDir.exists()) {
if (multiLevelDir.mkdirs()) {
System.out.println("多层目录创建成功:" + multiLevelDir.getAbsolutePath());
} else {
System.err.println("多层目录创建失败,请检查路径或权限:" + multiLevelDir.getAbsolutePath());
}
} else {
System.out.println("目录已存在,无需重复创建:" + multiLevelDir.getAbsolutePath());
}
// Step 3: 删除文件示例(只能删除文件或空目录),并进行删除前的检查
if (file.exists()) {
if (file.delete()) {
System.out.println("文件删除成功:" + file.getAbsolutePath());
} else {
System.err.println("文件删除失败,可能文件被占用或没有权限:" + file.getAbsolutePath());
}
} else {
System.out.println("文件不存在,无法删除:" + file.getAbsolutePath());
}
}
}
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
输出效果:
文件创建成功:C:\example\test.txt
多层目录创建成功:C:\example\a\b\c
文件删除成功:C:\example\test.txt
2
3
# 3. 文件/目录信息获取方法
这些方法用于获取文件或目录的名称、路径、大小、父目录等信息。
getName()
: 获取文件或目录的名称。getPath()
: 返回File
对象的路径。getAbsolutePath()
: 返回File
对象的绝对路径。getParent()
: 返回File
对象的父目录路径。length()
: 返回文件的大小(以字节为单位)。
import java.io.File;
public class FileInfoExample {
public static void main(String[] args) {
// 目标文件路径
File file = new File("C:\\example\\test.txt");
// 显示文件的基本信息
System.out.println("文件名称:" + file.getName());
System.out.println("文件路径:" + file.getPath());
System.out.println("文件绝对路径:" + file.getAbsolutePath());
System.out.println("父目录路径:" + file.getParent());
System.out.println("文件大小:" + file.length() + " 字节");
// 检查文件是否隐藏
if (file.isHidden()) {
System.out.println("文件是隐藏文件");
} else {
System.out.println("文件不是隐藏文件");
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
输出效果:
文件名称:test.txt
文件路径:C:\example\test.txt
文件绝对路径:C:\example\test.txt
父目录路径:C:\example
文件大小:1024 字节
文件不是隐藏文件
2
3
4
5
6
# 4. 文件列表获取方法
这些方法用于获取目录下所有文件和子目录的名称或 File
对象列表。
list()
: 返回一个字符串数组,这些字符串是当前目录中所有文件和子目录的名称。listFiles()
: 返回一个File
数组,这些File
对象表示当前目录中的文件和子目录。
import java.io.File;
public class DirectoryListExample {
public static void main(String[] args) {
// 目标目录路径
File dir = new File("C:\\example");
// 获取目录中的文件和子目录的名称列表
String[] fileList = dir.list();
if (fileList != null && fileList.length > 0) {
System.out.println("目录下的文件和子目录:");
for (String filename : fileList) {
System.out.println(filename);
}
} else {
System.out.println("目录为空或路径不正确:" + dir.getAbsolutePath());
}
// 获取目录中的文件和子目录的详细信息
File[] files = dir.listFiles();
if (files != null && files.length > 0) {
System.out.println("目录下的文件和子目录详细信息:");
for (File file : files) {
System.out.println(file.getName() + ", 绝对路径:" + file.getAbsolutePath() + ", 大小:" + file.length() + " 字节");
}
} else {
System.out.println("目录为空或路径不正确:" + dir.getAbsolutePath());
}
}
}
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
输出效果:
目录下的文件和子目录:
test.txt
a
目录下的文件和子目录详细信息:
test.txt, 绝对路径:C:\example\test.txt, 大小:1024 字节
a, 绝对路径:C:\example\a, 大小:0 字节
2
3
4
5
6
# 5. File 类的静态属性与跨平台路径处理
在跨平台开发中,路径分隔符的兼容性非常重要。Java 提供了以下属性来处理路径:
File.separator
: 系统路径分隔符,在 Windows 中为\
,在 UNIX 系统中为/
。File.pathSeparator
: 路径列表分隔符,在 Windows 中为;
,在 UNIX 系统中为:
。
使用这些属性可以编写在不同操作系统上都能正常运行的代码。
import java.io.File;
public class FileSeparatorExample {
public static void main(String[] args) {
// 构建跨平台路径
String path = "C:" + File.separator + "example" + File.separator + "test.txt";
File file = new File(path);
// 输出文件路径,确保路径格式正确
System.out.println("使用 File.separator 生成的路径:" + file.getPath());
}
}
2
3
4
5
6
7
8
9
10
11
12
输出效果:
使用 File.separator 生成的路径:C:\example\test.txt
总结
通过对 File
类的深入学习,我们能够高效地进行文件和目录的操作。无论是文件的创建、删除,还是目录的遍历,这些操作在实际开发中都有广泛的应用。我们还需要注意路径的跨平台处理,并处理好文件操作中的异常情况,以保证程序的健壮性。