一、java.io.File类:文件和目录路径名的抽象表示形式
java把电脑中的文件和文件夹(目录)封装成为了一个File类,我们可以使用File类对文件和文件夹进行操作
我们可以使用File类的方法:
创建一个文件/文件夹
删除一个文件/文件夹
获取文件/文件夹
判断文件/文件夹是否存在
对文件夹进行遍历
获取文件的大小
File类是一个与系统无关的类,任何的操作系统都可以使用这个类中的方法
重点:
file:文件
directory:文件夹(目录)
path:路径
二、路径
路径:
绝对路径:是一个完整的路径。是以盘符开始的路径
相对路径:是一个简化的路径。相对指的是相对于当前项目的根目录,如果使用当前项目的根目录,路径可以简化书写(可以省略项目的根目录)
注意事项:
1.路径不区分大小写
2.路径中的文件名称分隔符Windows使用反斜杠(\),反斜杠是转义字符,两个反斜杠代表一个普通的反斜杠
三、File类的构造方法
1.File(String pathname)
File(String pathname):通过将给定路径名字符串转换为抽象路径来创建一个新File实例。
参数:
String pathname:字符串的路径名称
路径可以是以文件结尾,也可以是以文件夹结尾
路径可以是相对路径,也可以是绝对路径
路径可以是存在的,也可以是不存在的
创建File对象,只是把字符串路径封装为File对象,不考虑路径的真假情况
2.File(String parent, String child)
File(String parent, String child) 根据parent路径名字符串和child路径名字符串创建一个新File实例
参数:把路径分成了两部分
String parent:父路径
String child:子路径
好处:
父路径和子路径,可以单独书写,使用起来非常灵活,父路径和子路径都可以变化
3.File(File parent, String child)
File(File parent, String child) 根据parent抽象路径名和child路径名字符串创建一个新File实例。
参数:把路径分成了两个部分
File parent:父路径
String child:子路径
好处:
父路径和子路径,可以单独书写,使用起来非常灵活,父路径和子路径都可以变化
父路径是File类型,可以使用File类的方法对路径进行一些操作,再使用路径创建对象
四、File类获取功能的方法
1.public String getAbsolutePath()
返回此File的绝对路径名字符串
获取的就是构造方法中传递的路径
无论路径是绝对的还是相对的,getAbsolutePath方法返回的都是绝对路径
2.public String getPath()
将此File转换为路径名字符串
获取的就是构造方法中传递的路径
toString方法实际上调用的就是getPath方法
源码:
public String toString() {
return getPath();
}
3.public String getName()
返回由此File表示的文件或目录的名称
获取的就是构造方法传递路径的结尾部分(文件/文件夹)
4.public long length()
返回由此File表示的文件的长度
获取的是构造方法指向的文件的大小,以字节为单位
注意:
1.文件夹是没有大小概念的,所以不能获取文件夹的大小
2.如果构造方法中给出的路径不存在,那么length方法返回0
五、File判断功能的方法
1.public boolean exists()
此File表示的文件或目录是否实际存在
用于判断构造方法中的路径是否存在
存在:true
不存在:false
2.public boolean isDirectory()
此File表示的是否为目录
用于判断构造方法中给定的路径是否以文件夹结尾
public boolean isFile():此File表示的是否为文件
用于判断构造方法中给定的路径是否以文件结尾
注意:
电脑的硬盘中只有文件/文件夹,两个方法是互斥的
这两个方法的使用前提:路径必须是存在的,否则都返回false
3.public boolean isFile()
此File表示的是否为文件
六、File类创建删除功能的方法
1.public boolean createNewFile()
当且仅当具有该名称的文件尚不存在时,创建一个新的空文件
创建文件的路径和名称在构造方法中给出(即构造方法的参数)
返回值:布尔值
true:文件不存在,创建文件,返回true
false:文件存在,不会创建,返回false
注意:
1.此方法只能创建文件,不能创建文件夹
2.创建文件的路径必须存在,否则会抛出异常
public boolean createNewFile() throws IOException
createNewFile方法声明抛出了IOException,我们调用这个方法,就必须处理这个异常,要么throws,要么try...catch
2.mkdir() VS mkdirs()
public boolean mkdir():创建单级文件夹
public boolean mkdirs():既可以创建单级文件夹,也可以创建多级文件夹
创建文件夹的路径和名称在构造方法中给出(即构造方法的参数)
返回值:布尔值
true:文件夹不存在,创建文件夹,返回true
false:文件夹存在,不会创建,返回false;构造方法中给出的路径不存在返回false
注意:
此方法只能创建文件夹,不能创建文件
3.public boolean delete()
删除由此File表示的文件或目录
此方法,可以删除构造方法路径中给出的文件/文件夹
返回值:布尔值
true:文件/文件夹删除成功,返回true
false:文件夹中有内容,不会删除,返回false;构造方法中给出的路径不存在返回false
注意:
delete方法是【直接在硬盘】删除文件/文件夹,不走回收站,删除要谨慎
七、File类遍历(文件夹)目录功能
1.public String[] list()
返回一个String数组,表示该File目录中的所有子文件或目录
遍历构造方法中给出的目录,获取目录中所有文件或文件夹的名称,把获取到的多个名称存储到一个String类型的数组中
2.public File[] listFiles()
返回一个File数组,表示该File目录中的所有子文件或目录
遍历构造方法中给出的目录,会获取目录中所有的文件/文件夹,把文件/文件夹封装为File对象,多个File对象存储到File数组中
3.注意事项
list方法和listFiles方法遍历的是构造方法中给出的[目录]
如果构造方法中给出的[路径不存在],会抛出空指针异常
如果构造方法中给出的路径[不是一个目录],也会抛出空指针异常
八、递归
递归概念
方法自己调用自己
递归的分类
递归分为两种:直接递归和间接递归:
-直接递归称为方法自身调用自己。
-间接递归可以分为A方法调用B方法,B方法调用C方法,C方法调用A方法。
注意事项
-递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出
-在递归中虽然有限定条件,但是递归次数不能太多。否则也会发生栈内存溢出
-构造方法,禁止递归
-递归的使用前提:
-当调用方法的时候,方法的主体不变,每次调用方法的参数不同,可以使用递归
九、过滤器
1.问题
如果遍历完一个文件夹中的文件以后,只想要以.java结尾的文件,则可以通过过滤器实现。
2.分类
在File类中有两个和ListFiles重载的方法,方法的参数传递的就是过滤器
2.1 file[] listFiles(FileFilter filter)
java.io.FileFilter接口:用于抽象路径名(File对象)的过滤器。
作用:用来过滤文件(File对象)
抽象方法;用来过滤文件的方法
boolean accept(File pathname) 测试指定抽象路径名是否应该包含在某个路径名列表中
参数:
File pathname:使用ListFiles方法遍历目录,得到的每一个文件对象
2.2 file[] listFiles(filenameFilter filter)
java.io.FilenameFilter接口:实现此接口的类实例可用于过滤器文件名
作用:用于过滤文件名称
抽象方法:用来过滤文件的方法
boolean accept(File dir, String name) 测试指定文件是否应该包含在某一文件列表中
参数:
File dir:构造方法中传递的被遍历的目录
String name:使用listFiles方法遍历目录,获取的每一个文件/文件夹的名称
注意事项:
两个过滤器接口是没有实现类的,需要我们自己写实现类,重写过滤的方法accept,在方法中自己定义过滤的规则
3.代码分析
File[] files = dir.listFiles((d, name) -> new File(d, name).isDirectory() || name.toLowerCase().endsWith(".java"));
listFiles方法一共做了3件事:
1.listFiles方法会对构造方法中传递的目录进行遍历,获取目录中的每一个文件/文件夹-->封装为File对象
2.listFiles方法会调用参数传递的过滤器中的方法accept
3.listFiles方法会把遍历得到的每一个File对象,传递给accept方法的参数pathname
accept方法返回值是一个布尔值:
true:就会把传递过去的File对象【保存到File数组】中
false:不会把传递过去的File对象保存到File数组中
过滤的规则:
在accept方法中,判断File对象是否以.java结尾
是就返回true,不是返回false