一、File类
1,概述🏀🏀🏀
(1) java.io.File类:文件和文件目录路径的抽象表示形式,与平台无关
(2) File类中涉及到关于文件或文件目录的创建、删除、重命名、修改时间、文件大小等方法,创建File对象的目的就是为了使用这些方法 ,但它并未涉及到写入或读取文件内容的操作。如果需要读取或写入文件内容,必须使用IO流来完成。
(3) 想要在Java程序中表示一个真实存在的文件或目录,那么必须有一个File对象,但是Java程序中的一个File对象,可能没有一个真实存在的文件或目录。
(4) File对象可以作为参数传递给流的构造器,指明读取或写入的"终点"。
2、File类的使用🏀🏀🏀
1. 绝对路径 vs 相对路径
🧩绝对路径:是一个固定的路径,从盘符开始
🧩相对路径:是相对于某个位置开始
- main()方法中的相对路径是相对于当前工程
- 单元测试方法中的相对路径是相对于当前模块
2. 路径分隔符
🧩路径中的每级目录之间用一个路径分隔符隔开。
🧩路径分隔符和系统有关:
- windows和DOS系统默认使用"\"来表示
- UNIX和URL使用"/"来表示
🧩Java程序支持跨平台运行,因此路径分隔符要慎用。
为了解决这个隐患,File类提供了一个常量:
public static final String separator:根据操作系统,动态的提供分隔符
3,常用的构造方法
public File (String pathname) | 根据文件路径创建文件对象(不可能是文件夹) |
public File (String parent,String child) | 根据父路径名字符串和子路径名字符串创建文件对象 |
public File (File parent,String child) | 根据父路径对应文件对象和子路径名字符串创建文件对象 |
代码演示:
public static void main(String[] args) {
//1,根据字符串表示的路径,变成File对象。
//变成File对象的目的:使用File里面的方法
String str="D:\\FileDemo\\b2.txt";
File f1 = new File(str);
System.out.println(f1);//字符串变成了真实的路径,D:\FileDemo\b2.txt
//2,父级路径:D:\FileDemo
// 子级路径:b2.txt
String parent="D:\\FileDemo";
String child="b2.txt";
File f2 = new File(parent, child);
System.out.println(f2);
//3,
File fileParent = new File("D:\\FileDemo");
File f3 = new File(fileParent, "b2.txt");
System.out.println(f3);
}
结果:
4,成员方法
public long length() | 返回文件的大小(不能是文件夹) |
public String getAbsolutePath() | 返回文件的绝对路径 |
public long lastModifies() | 返回文件最后修改的时间(时间毫秒值) |
public String getPath() | 返回定义文件时使用的路径 |
public String getName() | 返回文件的名称。带后缀 |
public String getName():
📝 细节1: 调用者是文件:返回文件的名称+后缀 b1.txt
b1:文件名
txt:扩展名
📝细节2: 调用者是文件夹:返回文件夹名称
代码演示:
public static void main(String[] args) {
//定义File对象
File f1 = new File("D:\\FileDemo\\b1.txt");//文件
File files = new File("D:\\FileDemo\\aaa");//文件夹
//1,返回文件的大小(单位字节)
long l = f1.length();
System.out.println(l);//6
System.out.println(files.length());//0
System.out.println("------------------=---");
//2,getAbsolutePath() 返回文件的绝对路径
String path = f1.getAbsolutePath();
System.out.println(path);//D:\FileDemo\b1.txt
File f4 = new File("FileDemo1");//写的是相对路径
String path1 = f4.getAbsolutePath();
System.out.println(path1);//C:\Users\86166\IdeaProjects\one\FileDemo1
System.out.println("------------------=---");
//3,getPath() 返回定义文件时使用的路径,就是括号里的参数是什么就返回什么
String path2 = f1.getPath();
System.out.println(path2);//D:\FileDemo\b1.txt
File f5 = new File("FileDemo1");
String path3 = f5.getPath();//FileDemo1
System.out.println(path3);
System.out.println("------------------=---");
String f1Name = f1.getName();
System.out.println(f1Name);// b1.txt
System.out.println(files.getName());//aaa
System.out.println("------------------=---");
//4,lastModifies() 返回文件最后修改的时间(时间毫秒值)
long l1 = f1.lastModified();
System.out.println(l1);//毫秒值
Date date = new Date(1716713772066L);//Date
System.out.println(date);
SimpleDateFormat format = new SimpleDateFormat();
System.out.println(format.format(date));//Date-->String
}
结果:
5,成员方法:添加,删除
public boolean createNewFile() | 创建一个新的空文件(创建的一定是文件) |
public boolean mkdir | 创建单级文件夹 |
public boolean mkdirs | 创建多级文件夹 |
public boolean delete | 删除文件、空文件夹(不可能是有内容的 文件夹) |
public boolean createNewFile() :创建一个新的空文件(创建的一定是文件 )
📝细节1:
第一次运行的时候return ture就表示创建成功,所以第二次运行就会return false
📝细节2:
createNewFile:创建的一定是文件。如果不包含后缀,就创建一个不含后缀的文件
代码演示:
public static void main(String[] args) throws IOException {
//1,createNewFile() 创建一个新的空文件
File f1 = new File("D:\\FileDemo\\e1.txt");
boolean f1NewFile = f1.createNewFile();
System.out.println(f1NewFile);
File f2 = new File("D:\\FileDemo\\aaa2");
System.out.println(f2.createNewFile());
System.out.println("=========================");
//2,mkdir make Directory, 创建单级文件夹(目录)
File f3 = new File("D:\\FileDemo\\fff");
System.out.println(f3.mkdir());//true
File f4 = new File("D:\\FileDemo\\aaa\\b");
System.out.println(f4.mkdir());//true
System.out.println("=========================");
//3,mkdirs 创建多级文件夹
File f5 = new File("D:\\FileDemo\\aaa\\aa\\a");
System.out.println(f5.mkdirs());//true
System.out.println("=========================");
//4,delete 删除文件、空文件夹
System.out.println(f5.delete());//删除文件夹a
System.out.println(new File("D:\\FileDemo\\aaa\\aa").delete());//删除文件夹aa
//细节:
//如果删除的文件夹有内容,删除失败
}
6,成员方法:获取,遍历
(掌握)public File[] listFiles() | 获取当前路径下所有内容 |
public static File[] listRoots() | 列出可利用的文件系统根 |
public String[] list() | 获取当前该路径下所有内容 |
public String[] list(FilenameFilter filter) | 利用文件名过滤器获取当前该路径下所有内容 |
public File[] listFiles(FileFilter filter) | 利用文件名过滤器获取当前该路径下所有内容 |
public File[] listFiles(FilenameFilter filter) | 利用文件名过滤器获取当前该路径下所有内容 |
注意:📝📝📝📝📝📝
获得的所有内容都是指该路径下的一级内容,不包下面的子文件夹
重点:📝📝📝📝📝📝
🧩当调用者File表示的路径不存在时,返回null
🧩当调用者File表示的路径是文件时,返回null
🧩当调用者File返回的路径是空文件夹时,返回长度为0的数组
🧩当调用者File表示的路径是一个有内容的文件夹时,将里面所有的文件和文件夹路径放到File数组中返回
🧩当调用者File表示的路径是一个有隐藏内容的文件夹时,将里面所有的文件和文件夹路径放到File数组中返回,包含隐藏文件
🧩当调用者File表示的路径是需要权限才能访问的文件夹时,返回null
😊
代码演示:
public static void main(String[] args) {
//1,创建File对象
File f1 = new File("D:\\FileDemo");
System.out.println("======================");
//2,listFiles() 获取当前路径下所有一级内容
File[] files = f1.listFiles();
for (File f : files) {
//f依次表示FileDemo文件夹里面的所有文件或者文件夹
System.out.println(f);
}
System.out.println("======================");
//3,listFiles(FileFilter filter) 文件名过滤器的方法获取该路径下所有内容
File[] arrF = f1.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
return true;
}
});
System.out.println(Arrays.toString(arrF));
System.out.println("======================");
//4,,获取以.txt结尾的文件
System.out.println("方法一:---------------------------");
for (File file : files) {
if(file.isFile()&&file.getName().endsWith(".txt")){
System.out.println(file);
}
}
System.out.println("方法二:---------------------------");
//listFiles(FileFilter filter) 文件名过滤器的方法
File[] arr=f1.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
return pathname.isFile()&&pathname.getName().endsWith(".txt");
}
});
System.out.println(Arrays.toString(arr));
System.out.println("方法三:---------------------------");
/*
* accept()的参数:
* 参数一:父级路径
* 参数二:子级路径
* 返回值:true,表示当前路径保留
* false,表示当前路径舍弃不要
* */
String[] arr3 = f1.list(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
File pathname = new File(dir, name);
return pathname.isFile() && pathname.getName().endsWith(".txt");
}
});
System.out.println(Arrays.toString(arr3));
}
结果:
案例路径:
3,练习:
🎨🎨🎨需求:在当前模块下的aaa文件夹中创建一个a.txt文件
代码演示:
public static void main(String[] args) throws IOException {
//1,先创建一个父级路径
File parent = new File("aaa");
parent.mkdirs();
File aaaFile = new File(parent, "a.txt");
boolean b = aaaFile.createNewFile();
if(b){
System.out.println("创建成功");
}else {
System.out.println("创建失败");
}
}
结果:
需求:
🎨🎨🎨创建一个方法,找出所有以.avi结尾的文件
代码演示:
public static void main(String[] args) {
File file = new File("D:");
findAVI(file);
}
public static void findAVI(File src){
File[] files = src.listFiles();
if(files!=null){
for (File f : files) {
if(f.isFile()){
if(f.getName().endsWith(".avi")){
System.out.println(f);
}
}else{
findAVI(f);
}
}
}
}
//查找整个系统的.vai文件
/*public static void findAVI(){
File[] roots = File.listRoots();
for (File root : roots) {
findAVI(root);
}
}*/
结果: