Java进阶:File类
实际开发中,可以采用hutool的工具包噢
目前版本
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.8</version>
</dependency>
File类的概述
java.io.File
类是文件和目录路径名的抽象表示,主要用于文件和目录的创建、查找和删除等操作。
File类的构造方法
public File(String pathname)
:通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。public File(String parent, String child)
:从父路径名字符串和子路径名字符串创建新的 File实例。public File(File parent, String child)
:从父抽象路径名和子路径名字符串创建新的 File实例。- 构造举例,代码如下:
import java.io.File;
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);
}
}
- 一个File对象代表硬盘中的一个文件或者目录。
- 无论该路径下是否存在文件或者目录,都不影响File对象的创建。
获取功能的方法
public String getAbsolutePath()
:返回此File的绝对路径名字符串。public String getPath()
:将此File转换为路径名字符串。public String getName()
:返回由此File表示的文件或目录的名称。public long length()
:返回由此File表示的文件的字节大小。 不能获取目录的字节大小。
方法演示,代码如下:
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:\java\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:\java\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 String getAbsolutePath()
:返回此File的绝对路径名字符串。public String getPath()
:将此File转换为路径名字符串。public String getName()
:返回由此File表示的文件或目录的名称。public long length()
:返回由此File表示的文件的字节大小。 不能获取目录的字节大小。
方法演示,代码如下:
import java.io.File;
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表示的是否为文件。
方法演示,代码如下:
import java.io.File;
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表示的目录,包括任何必需但不存在的父目录。
方法演示,代码如下:
import java.io.File;
import java.io.IOException;
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表示目录,则目录必须为空才能删除。
遍历目录方法
public String[] list()
:返回一个String数组,表示该File目录中的所有子文件或目录的名称。public File[] listFiles()
:返回一个File数组,表示该File目录中的所有的子文件或目录的路径。
import java.io.File;
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文件的绝对路径。
分析
- 目录搜索,无法判断多少级目录,所以使用递归,遍历所有目录。
- 遍历目录时,获取的子文件,通过文件名称,判断是否符合条件。
实现
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);
}
}
}
}
}