目录
一、java.io.File
File类的每一个实例用于表示硬盘上的一个文件或目录,使用File可以:
1.访问该文件或目录是属性信息 名字大小,修改时间等
2.创建或删除文件或目录
3.访问一个目录中的所有子项
但是使用File不能读写文件中的数据,有其他API可以做到
1、路径
创建File对象需要指定其表示的文件夹目录的路径和信息,路径有两种写法:
① 绝对路径:从盘符开始,例如:D:\home\FYX_Month01_Week03\src\com\fyx\day05
② 相对路径,根据当前位置确定,例如:"./demo.txt"。其中.代表当前目录 ..代表上级目录
---
区别:
绝对路径的优点在于清晰明了,缺点在于位置是固定的,不利于跨平台。如果项目位置发生改变,存在找不到文件的风险。
相对路径的优点在于适应性好,利于跨平台。缺点是不清晰,需要是当前程序的运行环境而定。
在Eclipse/idea等开发工具中,当前目录的位置就是当前程序所在的目录。
2、File属性常用方法:
① [String] getName() 获取文件名
② [long] length() 获取文件的长度 --字节数
③ [boolean] canRead() 是否可读
[boolean] canWrite() 是否可写
④ [boolean] isHidden() 是否隐藏
3、File创建常用方法:
① [boolean] exist() 判断文件是否存在或目录是否存在
② [boolean] createNewFile() 当且仅当该File对象表示的文件不存在时, 创建一个
③ [boolean] mkdir() 当且仅当该File对象表示的目录不存在时,创建当前File对象所表示的目录,要求创建的目录所在的目录必须存在,否则创建不成功。
④ [boolean] mkdirs() 创建该File指定的目录,包括所有必须但是不存在的父类目录。
4、List;FileFilter
① [boolean] isFile() 判断当前File是否表示一个文件
② [boolean] isDirectory() 判断是否为一个目录
③ [String数组] list() 获取该File对象表示的目录下所有文件
④ [File数组] listFiles() 获取该File对象所表示的目录下所有子项,每个子项都以一个File对象的形式表示,最终以数组的形式返回
⑤ listFiles()有一个重载方法,允许我们传入一个文件过滤器FileFilter,然后将该目录中符合过滤器要求的子项获取出来。
二、递归
在方法内部调用方法本身,节省代码量,但效率不高
public static void delDirs (File dir){
//1.获取目标数组中的所有子项
File[] subs = dir.listFiles();
//2.遍历数组,获取每个子项
for (int i = 0; i < subs.length; i++) {
//3.判断该子项是文件还是目录,如果是文件直接删除
if(subs[i].isFile()){
subs[i].delete();
}else{//如果是目录,需要再获取遍历判断……
delDirs(subs[i]);//递归,重复之前做的1 2 3
}
}
dir.delete();//删除空目录
}
过程:
假如还有别的文件:
三、lambda表达式:
JDK8后推出了一个新特性:lambda表达式
lambda表达式可以用更简洁的语法创建匿名内部类。
语法:(参数列表) ->{ 方法体 }
需要注意的是,使用lambda表达式创建时必须是接口的实现类,而且注意实现的接口中只能有一个抽象方法(普通方法不耽误)。
不使用lambda表达式时
只能使用匿名内部类创建接口的实现类对象
//使用匿名内部类的方式创建文件过滤器:
File file = new File("./src/com/fyx");
FileFilter filter = new FileFilter() {
@Override
public boolean accept(File file) {
return file.getName().contains("days");
}
};
使用lambda表达式时
编译器会结合程序的语义分析出实现的是哪个结构,由于要求接口中只能有一个抽象方法,所以也能知道重写的方法名是什么,最终会将它还原为匿名内部类。
//使用lambda表达式创建:
FileFilter filter1 = (File file1)->{
return file1.getName().contains("days");
};
lambda表达式可以简写
参数名可以不写,当方法中只有一句代码时,方法体的{}可以忽略不写,并且如果该方法要求返回值,则return关键字也要一起省略。
//进一步省略::参数名可以不写
FileFilter filter2 = (file2)->{
return file2.getName().contains("days");
};
//进进一步省略:: { }和返回值可以成对不写
FileFilter filter3 = (file3)->file3.getName().contains("days");