File类、递归
File类
概述
java.io.File
类是文件和目录路径名的抽象表示,主要用于文件和目录的创建、查找和删除等操作。
构造方法
public File(String pathname)
:通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。
参数:
String pathname:字符串的路径名称
路径可以是以文件结尾,也可以以文件夹结尾
路径可以是相对路径,也可以是绝对路径
路径可以存在,也可以是不存在
创建File对象,只是把字符串路径封装成File对象,不考虑路径的真实情况
public File(String parent, String child)
:从父路径名字符串和子路径名字符串创建新的 File实例。
参数:把路径分成两部分
String parent :父路径
String child:子路径
父路径和子路径,可以单独书写,并且父路径和子路径都可以变化
public File(File parent, String child)
:从父抽象路径名和子路径名字符串创建新的 File实例。
参数:把路径分成两部分
File parent :父路径
String child:子路径
父路径和子路径,可以单独书写,并且父路径和子路径都可以变化
父路径是File类型,可以使用File的方法对路径进行操作,再使用路径创建对象
常用方法
获得功能的方法
public String getAbsolutePath()
:返回此File的绝对路径名字符串。
获取的是构造方法中传递的路径
public String getPath()
:将此File转换为路径名字符串。
获取的是构造方法中传递的路径
public String getName()
:返回由此File表示的文件或目录的名称。
获取的是构造方法中传递的路径的结尾部分(文件/文件夹)
public long length()
:返回由此File表示的文件的长度。
获取的是构造方法指定文件的大小,以字节为单位
注意:文件夹没有大小概念,不能获取文件夹的大小
如果构造方法中给出的路径不存在,那么length方法返回0
绝对路径和相对路径
- 绝对路径:从盘符开始的路径,这是一个完整的路径。
- 相对路径:相对于项目目录的路径,这是一个便捷的路径,开发中经常使用。
例如:
"D:\\aaa\\bbb.txt" //绝对路径
"bbb.txt" //相对路径
判断功能的方法
-
public boolean exists()
:此File表示的文件或目录是否实际存在。 -
public boolean isDirectory()
:此File表示的是否为目录。
用于判断构造方法中给定的路径是否以文件夹结尾
是 : true
否 : false
public boolean isFile()
:此File表示的是否为文件。
用于判断构造方法中给定的路径是否以文件结尾
是 : true
否 : false
tips:
电脑硬盘只有文件/文件夹,两个方法互斥
两个方法使用前提,路径必须存在,否则返回 false
创建删除功能的方法
public boolean createNewFile()
:当且仅当具有该名称的文件尚不存在时,创建一个新的空文件。
创建文件的路径和名称在构造方法中给出(构造方法的参数)
返回值:布尔值
true :文件不存在,创建文件返回 true
false :文件存在,不会创建,返回 false
注意:
1.此方法只能创建文件,不会创建文件夹
2.创建文件的路径必须存在,否则抛出异常
public boolean creatNewFile() throws IOException
creatNewFile声明抛出IOException(路径不存在),调用这个方法必须处理异常,使用throws,或者try...catch
public boolean delete()
:删除由此File表示的文件或目录。
delete方法,如果此File表示目录,则目录必须为空才能删除。
返回值:布尔值
true :文件/文件夹删除成功,返回 true
false :文件夹中有内容,不会删除,返回 false ;
构造方法中路径不存在 返回 false
注意:
delete方法时直接在硬盘删除文件/文件夹,不走回收站,删除需谨慎
public boolean mkdir()
:创建由此File表示的目录。
创建单级文件夹
创建文件的路径和名称在构造方法中给出(构造方法的参数)
返回值:布尔值
true :文件夹不存在,创建文件夹返回 true
false :文件夹存在,不会创建,返回 false ;
构造方法中给出的路径不存在返回false
public boolean mkdirs()
:创建由此File表示的目录,包括任何必需但不存在的父目录。
即可以创建单级文件夹,也可以创建多级文件夹
目录的遍历
public String[] list()
:返回一个String数组,表示该File目录中的所有子文件或目录。
list方法和listFiles方法遍历的是构造方法中给出的目录
如果构造方法中给出的目录的路径不存在,抛出空指针异常
如果构造方法中给出的路径不是一个目录,抛出空指针异常
public File[] listFiles()
:返回一个File数组,表示该File目录中的所有的子文件或目录。
调用 listFiles 方法的File对象,表示的必须是实际存在的目录,否则返回null,无法进行遍历。
递归
概述
递归:指在当前方法内调用自己的这种现象
递归分类:直接递归和间接递归
直接递归:方法自身调用自己
间接递归:A方法调用B方法,B方法调用C方法,C方法调用A方法。
注意:
1.递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出。
2.在递归中虽然有限定条件,但是递归次数不能太多。否则也会发生栈内存溢出。
3.构造方法,禁止递归
递归必须明确:
1.递归的结束条件
2.递归的目的
递归计算1~n的和
public class DiGuiDemo {
public static void main(String[] args) {
//计算1~num的和,使用递归完成
int num = 3;
// 调用求和的方法
int sum = getSum(num);
// 输出结果
System.out.println(sum);
}
public static int getSum(int num) {
//如果为1,则返回1
if(num == 1){
return 1;
}
/*
num不为1时,方法返回 num +(num-1)的累和
递归调用getSum方法
*/
return num + getSum(num-1);
}
}
原理:
文件过滤器
java.io.FileFilter
是一个接口,是File的过滤器。
该接口的对象可以传递给File类的listFiles(FileFilter)
作为参数, 接口中只有一个方法。
在File类中,有两个和 ListFiles 重载的方法,方法的参数传递就是过滤器
File[] listFiles(FileFilter filter)
java.io.FileFilter接口:用于抽象路径名(File对象)的过滤器
作用:用来过滤文件(File对象)
抽象方法:用来过滤文件的方法
boolean accept(File pathname) :测试抽象路径名是否应该包含在某个路径名列表中
参数:
File pathname:使用ListFiles方法遍历目录,得到每一个文件对象
--------------------------------------------------
java.io.FilenameFilter接口:实现此接口的类实例可用于过滤器文件名
作用:用来过滤文件(File对象)
抽象方法:用来过滤文件的方法
boolean accept(File dir , String name) :测试指定文件名是否应该包含在某一文件列表中
参数:
File dir:构造方法中传递的被遍历的目录
String name:使用ListFiles方法遍历目录,获取每一个文件/文件夹的名称
//两个过滤器接口都没有实现类,需要自己实现,重写过滤的方法accept,在方法中自己定义过滤的规则
boolean accept(File pathname)
:测试pathname是否应该包含在当前File目录中,符合则返回true。
步骤分析:
1.接口作为参数,传递子类对象,重写其中方法(可以选择匿名内部类)
2.accpect方法(参数 File ) 保留住则返回true,过滤掉则返回false。 保留规则:
1. 要么是.java文件。
2. 要么是目录,用于继续遍历。
3. 通过过滤器的作用,listFiles (FileFilter) 返回的数组元素中,子文件对象符合条件的,可以直接打印
后续理解,可以使用Lambda优化