File类,递归和过滤器
一:File类
1.1:FIle类的介绍
File类是Java操作计算机里面的文件和文件夹,并且该类的对象可以对文件和文件夹进行一系列的操作
File:文件; Path:路径; Directory:目录
1.2:File类的构造方法
概述:
有四种方式可以用来创建File类对象(可以根据相对地址和绝对地址)。
例子(创建对象):
File(String pathname)
File(String parent, String child
File(File parent, String child)
1.3:File类的创建方法
a:创建文件
public boolean createNewFile() :当且仅当具有该名称的文件尚不存在时,
创建一个新的空文件
b:创建文件夹
public boolean mkdir() :创建由此File表示的目录。
c:创建多级目录
public boolean mkdirs() :创建由此File表示的目录,包括任何必需但不存在的父目录。
1.4:File类的获取方法
a:获取文件的绝对路径
public String getAbsolutePath() :返回此File的绝对路径名字符串。(重点)
b:获取文件名
public String getName() :返回由此File表示的文件或目录的名称。(重点)
c:获取文件的长度
public long length() :返回由此File表示的文件的长度。(文件夹的长度为0)
d:把File转化为字符串路径
public String getPath() :将此File转换为路径名字符串。(了解)
1.5:File类的判断方法
a:判断文件是否存在
public boolean isFile() :此File表示的是否为文件。
b:判断文件夹是否存在
public boolean isDirectory() :此File表示的是否为目录。
c:判断文件和文件夹是否存在
public boolean exists() :此File表示的文件或目录是否实际存在。
1.6:File类的遍历方法
a:获取该文件下的所有文件和文件夹的名字(字符串形式)
public String[] list() :返回一个String数组,表示该File目录中的所有子文件或目录的名称。
b:获取该文件下的所有文件和文件夹对象。(File类)
public File[] listFiles() :返回一个File数组,表示该File目录中的所有的子文件或目录
1.7:File类的绝对路径和相对路径的定义
绝对路径:带有盘符名开头的路径,比如:D:\io_test\a.txt
相对路径: 不带有盘符名开头的路径,比如:a.txt b io_test\a.txt
1.8:File文件的删除
代码:
public boolean delete() :删除由此File表示的文件或目录。
注意:
1.在java中删除一个文件夹,如果该文件夹中还有内容,是不能直接删除,
必须把子内容全部删除完毕才可以删除
2.delete方法慎用,删除之后无法恢复的
1.7:总结:
Java中提供一个类,用来表示一个个文件和文件夹。并且提供了一些方法,
可以对文件进行创建,对文件进行删除,获取文件路径名,文件名,获取
文件的长度,判断文件是否存在。找出该文件下的所有文件和文件夹
二:递归
2.1:什么是递归
自己调用自己,并且有一个递归结束条件
2.2:递归的例题和分析
a:
要求:求出阶乘
数学规律:n!= n*(n-1)!;阶乘的结束条件:1! = 1
public class Demo02 {
public static void main(String[] args) {
//求5的阶段
int result = getJieCheng(5);
System.out.println(result);
}
//定义出一个方法能够直接动态得到固定值的阶乘结果
public static int getJieCheng(int n) {
//递归结束条件
if (n == 1) {
return 1;
}
return n * getJieCheng(n - 1);
}
}
b:
问题:找出文件里面的所有文件名
数学规律:找出当前文件的文件名,和文件夹里面的文件名;结束条件:该目录下没有文件夹
public class FileDemo04 {
public static void main(String[] args) {
File file = new File("d:/io_test");
//定义出一个方法获取指定目录中的所有的文件
getFiles(file);
}
private static void getFiles(File file) {
File[] files = file.listFiles();
for (File f : files) {
if (f.isDirectory()) {
//如果是文件夹,那么我们继续遍历
System.out.println(f.getName());
getFiles(f);//遍历b文件夹
} else {
System.out.println(f.getName());
}
}
}
c:
要求:从键盘接收一个文件夹路径,获得该文件夹大小并输出到控制台。
数学问题:把当前文件夹下面的文件长度,加上文件夹里文件的长度;结束条件:没有文件夹
public class Demo12 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个路径:");
String s = sc.nextLine();
File file = new File(s);
getNum(file);
}
private static long getNum(File file) {
int num = 0;
for (File file1 : file.listFiles()) {
if (file1.isFile()){
num += file1.length();
}else {
num += getNum(file1);
}
}
return num;
}
}
d:
问题:将文件夹的文件和文件夹全部删完;
数学问题:删除该文件夹下的文件,和文件夹;结束条件:没有文件夹
过程:取出该文件夹下的所有文件和文件夹,如果是空文件和文件夹直接删除,
如果不是空文件夹直接递归调用,(删除该文件夹的所有内容)。然后再删除
该文件夹根目录。
public class Demo11 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个路径名字:");
String s = sc.nextLine();
File file = new File(s);
getDelete(file);
file.delete();
}
private static void getDelete(File file) {
for (File file1 : file.listFiles()) {
if(file1.isFile()){
file1.delete();
}else {
if(file1 == null){
file1.delete();
}else {
getDelete(file1);
}
}
//删除根文件
file1.delete();
}
}
}
2.3:总结
递归就是找规律,然后判断当前状况和下一次状况的关系。什么情况下进行递归调用。
什么情况下跳出递归
三:过滤器
3.1:什么时候用到过滤器
// 返回一个抽象路径名数组,表示由此抽象路径名表示的满足指定过滤器的目录中的文件和目录。
File[] listFiles(FileFilter filter):
3.2:过滤器的详细介绍
过滤器接口:
FileFilter是一个函数式接口,它只有一个抽象方法;
抽象方法:
boolean accept(File pathname) 测试指定的抽象路径名是否应包含在路径名列表中。
使用过滤器的执行过程:
每个子元素会依次进入到accept方法中,执行得到结果,如果结果是true就保存在
返回值(File[] )中,否则就直接过滤掉
3.3:过滤器的代码
public class LambdaTest03 {
public static void main(String[] args) {
File file = new File("D:\\io_test");
//递归遍历文件夹,判断是txt文件就打印
getFiles(file);
}
private static void getFiles(File file) {
//过滤器一:构造方法
/*File[] files = file.listFiles(new FileFilter() {
@Override
public boolean accept(File f) {
return f.isDirectory() || f.getName().endsWith(".txt");
}
});*/
//过滤器二:lanbda表达式
File[] files = file.listFiles(f -> f.isDirectory() || f.getName().endsWith(".txt"));
for (File f : files) {
if (f.isDirectory()) {
getFiles(f);
} else {
System.out.println(f.getName());
}
}
}
}
3.4:过滤器的源码分析

3.5:总结
我们在进行File文件进行遍历的时候,listFiles方法里面可以用一个过滤器当参数,
每个元素进入过滤器,如果满足就保存在数组中,不满足就舍弃。过滤器就是一
个函数式接口我们要实现接口的抽象方法来进行要过滤的内容
四:总结
就是File类代表电脑上的文件,可以对文件进行以一系列的操作。
然后学习怎样用递归
在找文件夹下的文件和文件夹,引出过滤器