File对象主要是用来表示文件或者是目录的路径的。类中提供了很多对文件或者文件夹操作的常用方法。
创建File对象的方式
- 绝对路径
以磁盘名开头的路径。例如:C:\Windows - 相对路径
不是以盘符开头的,相对于当前项目下的路径。例如: a.txt
File(String pathname) //通过字符串类型的路径来创建对象
File(String parent, String child) //通过父目录的路径(字符串类型)和文件(文件夹)名称来创建对象
File(File parent, String child)//通过父目录的路径(File类型)和文件(文件夹)名称来创建对象
常用方法
创建文件夹与文件
boolean createNewFile()//根据路径创建一个文件,返回值代表创建是否成功
boolean mkdir() //根据路径创建一个文件夹,返回值代表创建是否成功
boolean mkdirs() //根据路径创建一个文件夹,如果父目录不存在会自动创建父目录
三者的区别:
createNewFile()
只能创建文件 而其他两个只能创建目录。
File file1 = new File("E:\\Test\\a");
File file2 = new File("E:\\Test\\b.txt");
File file3 = new File("E:\\Test\\c.txt");
file1.createNewFile();
file2.mkdir();
file3.mkdirs();
createNewFile()
和mkdir()
不会自动创建父目录。如果指定路径中的父目录不存在,它将无法创建文件\目录。mkdirs()
与前两者不同,mkdirs() 会自动创建任何缺失的父目录,如果父目录不存在的话。这是它与其他两种方法的主要区别。- 如果目录或文件存在都会创建失败
- 权限不足会抛出异常
判断
boolean exists() //判断文件或者文件夹是否存在
boolean isFile() //判断是否是一个文件
boolean isDirectory() //判断是否是一个文件夹
删除
boolean delete() //删除文件,或者删除空文件夹,返回值代表删除是否成功
获取信息
long length() //获取一个文件的大小,对文件夹无意义
String getName()//获取文件或文件夹的名字
File getParentFile() //获取父目录的File对象
String getAbsolutePath()//获取File对象的绝对路径
// 重要
File[] listFiles() //如果当前File对象是一个文件夹,可以获取文件夹下的所有文件或者文件夹的File对象。
重要方法
File[] listFiles() //如果当前File对象是一个文件夹,可以获取文件夹下的所有文件或者文件夹的File对象。
File[] listFiles()
是 Java 中 File
类的一个重要方法,它用于获取指定目录中的所有文件和子目录,并返回一个包含它们的 File
对象数组。这个方法在文件操作中非常有用,因为它允许你遍历目录内容,执行各种文件操作,如复制、移动、删除等。
以下是 File[] listFiles()
方法的一些重要用途和优点:
-
目录内容遍历:通过调用
listFiles()
方法,你可以轻松地获取目录中的所有文件和子目录的引用,从而可以递归遍历目录内容,查找特定类型的文件,或执行其他文件操作。 -
文件操作:你可以使用
listFiles()
结合其他文件操作方法来执行复杂的文件操作,如批量复制、移动、删除、重命名文件,以及在文件夹中搜索文件等。 -
目录信息获取:通过遍历目录的内容,你可以获得目录内文件和子目录的信息,如文件名、大小、创建时间、最后修改时间等。
-
批量处理:当你需要批量处理一组文件或子目录时,
listFiles()
提供了一种方便的方式,使你能够针对目录中的所有项目执行相同的操作。 -
文件筛选:你可以使用
listFiles()
结合过滤器来筛选出特定类型的文件或目录,以满足你的需求。
示例用法:
File directory = new File("E:\\my_directory");
File[] files = directory.listFiles();
if (files != null) {
for (File file : files) {
if (file.isFile()) {
System.out.println("文件: " + file.getName());
} else if (file.isDirectory()) {
System.out.println("目录: " + file.getName());
}
}
}
File[] listFiles()
方法是处理文件和目录的基本工具之一,它能够有效地管理和操作文件系统中的内容。
使用listFiles()实现深度\广度优先遍历文件目录
深度优先遍历
深度优先遍历(DFS):
- DFS从起始节点(通常是根节点)开始遍历,然后沿着一条路径尽可能深入地访问节点,直到不能再深入为止。
- 当无法再深入时,回溯到上一个未访问过的节点,并尝试遍历它的其他分支。
- 使用栈(Stack)数据结构来实现DFS,通常递归也是一种实现DFS的方式。
- DFS适合解决深度相关的问题,如查找路径、拓扑排序等。
public void Search(){
File file = new File("E:\\Test");
DFS(file);
}
private void DFS(File file){
if (file.isDirectory()){
// 获取File对象的绝对路径
System.out.println("目录: " + file.getAbsolutePath());
File[] files = file.listFiles();
if (files != null) {
for (File f : files) {
DFS(f);
}
}
}else {
System.out.println("文件: " + file.getAbsolutePath());
}
}
广度优先遍历
广度优先遍历(BFS):
- BFS从起始节点开始,首先访问所有与起始节点直接相邻的节点,然后依次访问它们的邻居节点。
- BFS使用队列(Queue)数据结构来实现,确保先访问所有距离起始节点相同的节点,然后再移向距离更远的节点。
- BFS适合用于查找最短路径或最短步骤的问题,因为它首先访问离起点最近的节点。
public void Search(){
File file = new File("E:\\Test");
BFS(file);
}
private void BFS(File file){
Queue<File> queue = new LinkedList<>();
queue.add(file);
while (!queue.isEmpty()){
File poll = queue.poll();
if (poll.isDirectory()){
System.out.println("目录: " + poll.getAbsolutePath());
if (poll.isDirectory()) {
File[] files = poll.listFiles();
if (files != null) {
for (File f : files) {
queue.add(f);
}
}
}
}else {
System.out.println("文件: " + poll.getAbsolutePath());
}
}
}
不管是广度还是深度优先遍历都需要listFiles()
可见其重要性。
删除指定目录的全部文件
前面我们说delete()
只能删除文件或者空目录,使用深度优先遍历就可以实现删除指定目录的全部文件。
- 如果是文件直接删除
- 是空目录直接删除
- 不是空目录继续深度遍历
- 删除非空目录的文件或空目录使其成为空目录
public void deleteAll(File file) {
if (file.isDirectory()) {
File[] files = file.listFiles();
if (files != null) {
for (File f : files) {
deleteAll(f);
}
}
}
System.out.println("删除:" + file.getAbsolutePath());
file.delete();
}