JavaFile类和递归
八、File类和递归
8.1 概述
java.io.File 类时文件和目录路径名的抽象表示,主要用于文件和目录的创建、查找和产出等操作。
8.2 构造方法
-
public File(String pathname) :通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。
-
public File(String parent, String child)
:从父路径名字符串和子路径名字符串创建新的 File实例。 -
public File(File parent, String child)
:从父抽象路径名和子路径名字符串创建新的 File实例。// 文件路径名 String pathname = "D:\\aaa.txt"; File file1 = new File(pathname); // 文件路径名 String pathname2 = "D:\\aaa\\bbb.txt"; File file2 = new File(pathname2); // 通过父路径和子路径字符串 String parent = "d:\\aaa"; String child = "bbb.txt"; File file3 = new File(parent, child); // 通过父级File对象和子路径字符串 File parentDir = new File("d:\\aaa"); String child = "bbb.txt"; File file4 = new File(parentDir, child);
171// 文件路径名
2String pathname = "D:\\aaa.txt";
3File file1 = new File(pathname);
45// 文件路径名
6String pathname2 = "D:\\aaa\\bbb.txt";
7File file2 = new File(pathname2);
89// 通过父路径和子路径字符串
10String parent = "d:\\aaa";
11String child = "bbb.txt";
12File file3 = new File(parent, child);
1314// 通过父级File对象和子路径字符串
15File parentDir = new File("d:\\aaa");
16String child = "bbb.txt";
17File file4 = new File(parentDir, child);
Tips:
1.一个File对象 代表硬盘中实际存在的一个文件或目录
2.无论该路径下是否存在文件或者目录,都不影响File对象的创建
8.3 获取功能 的方法
-
public String getAbsolutePath() ` :返回此File的绝对路径名字符串。
-
public String getPath()
:将此File转换为路径名字符串。 -
public String getName()
:返回由此File表示的文件或目录的名称。 -
public long length()
:返回由此File表示的文件的长度。 -
tips:
-
length() 表示文件的长度 但是 目录的长度未指定
8.4 判断功能的方法
-
public boolean exists()` :此File表示的文件或目录是否实际存在。
-
public boolean isDirectory()
:此File表示的是否为目录。 -
public boolean isFile()
:此File表示的是否为文件。
notes: 创建的文件对象 必须是真实存在的 才能判断成功,如果此File表示目录,则目录必须为空才能删除。
8.5创建删除功能的方法
-
-
public boolean delete()
:删除由此File表示的文件或目录。 notes:当目录为空才能删除, -
public boolean mkdir()
:创建由此File表示的目录。 -
public boolean mkdirs()
:创建由此File表示的目录,包括任何必需但不存在的父目录。
-
public String[] list()
:返回一个String数组,表示该File目录中的所有子文件或目录。
-
public File[] listFiles()
:返回一个File数组,表示该File目录中的所有的子文件或目录。 -
tips:
-
调用listFile 方法的File对象 表示 的必须是实际存在的目录,否则会返回null,无法进行遍历
9、递归
9.1 概述
自己调用自己的现象。
递归思想顺序
9.2 举例子介绍:
public class DiGuiDemo {
public static void main(String[] args) {
//计算1~num的和,使用递归完成
int num = 5;
// 调用求和的方法
int sum = getSum(num);
// 输出结果
System.out.println(sum);
}
/*
通过递归算法实现.
参数列表:int
返回值类型: int
*/
public static int getSum(int num) {
/*
num为1时,方法返回1,
相当于是方法的出口,num总有是1的情况
*/
if(num == 1){
return 1;
}
/*
num不为1时,方法返回 num +(num-1)的累和
递归调用getSum方法
*/
return num + getSum(num-1);
}
}
30
1
public class DiGuiDemo {
2
public static void main(String[] args) {
3
//计算1~num的和,使用递归完成
4
int num = 5;
5
// 调用求和的方法
6
int sum = getSum(num);
7
// 输出结果
8
System.out.println(sum);
9
10
}
11
/*
12
通过递归算法实现.
13
参数列表:int
14
返回值类型: int
15
*/
16
public static int getSum(int num) {
17
/*
18
num为1时,方法返回1,
19
相当于是方法的出口,num总有是1的情况
20
*/
21
if(num == 1){
22
return 1;
23
}
24
/*
25
num不为1时,方法返回 num +(num-1)的累和
26
递归调用getSum方法
27
*/
28
return num + getSum(num-1);
29
}
30
}
tips:
递归调用保证:1.能够停止下来,有次数限制,否则会发生栈内存溢出
public class DiGuiDemo2 {
public static void main(String[] args) {
// 创建File对象
File dir = new File("D:\\aaa");
// 调用打印目录方法
printDir(dir);
}
public static void printDir(File dir) {
// 获取子文件和目录
File[] files = dir.listFiles();
// 循环打印
/*
判断:
当是文件时,打印绝对路径.
当是目录时,继续调用打印目录的方法,形成递归调用.
*/
for (File file : files) {
// 判断
if (file.isFile()) {
// 是文件,输出文件绝对路径
System.out.println("文件名:"+ file.getAbsolutePath());
} else {
// 是目录,输出目录绝对路径
System.out.println("目录:"+file.getAbsolutePath());
// 继续遍历,调用printDir,形成递归
printDir(file);
}
}
}
}
x
1
public class DiGuiDemo2 {
2
public static void main(String[] args) {
3
// 创建File对象
4
File dir = new File("D:\\aaa");
5
// 调用打印目录方法
6
printDir(dir);
7
}
8
9
public static void printDir(File dir) {
10
// 获取子文件和目录
11
File[] files = dir.listFiles();
12
// 循环打印
13
/*
14
判断:
15
当是文件时,打印绝对路径.
16
当是目录时,继续调用打印目录的方法,形成递归调用.
17
*/
18
for (File file : files) {
19
// 判断
20
if (file.isFile()) {
21
// 是文件,输出文件绝对路径
22
System.out.println("文件名:"+ file.getAbsolutePath());
23
} else {
24
// 是目录,输出目录绝对路径
25
System.out.println("目录:"+file.getAbsolutePath());
26
// 继续遍历,调用printDir,形成递归
27
printDir(file);
28
}
29
}
30
}
31
}
9.3 文件过滤器优化
java.io.FileFilter 是一个接口,是File的过滤器。该接口的对象可以传递给File类的listFiles(FileFilter) 作为参数,接口中只有一个方法,
boolean accept(File pathname): 测试pathanme 是否应该包含当前File目录中,符合则返回true
简单介绍:
1.接口作为参数,需要传递子类对象,重写其中方法。我们选择匿名内部类方式,比较简单。
2.accept 方法,参数为File,表示当前 File 下所有的子类文件和子目录。保留住 则返回true,过滤掉则返回false。保留规则:
①要么是 . java文件
② 要么是目录 ,用于继续遍历。
3.通过过滤器的作用,listFiles(FileFilter)返回的数组元素中,子文件对象都是符合条件的,可以直接打印
代码实现部分:
public class DiGuiDemo4 {
public static void main(String[] args) {
File dir = new File("D:\\aaa");
printDir2(dir);
}
public static void printDir2(File dir) {
// 匿名内部类方式,创建过滤器子类对象
File[] files = dir.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
return pathname.getName().endsWith(".java")||pathname.isDirectory();
}
});
// 循环打印
for (File file : files) {
if (file.isFile()) {
System.out.println("文件名:" + file.getAbsolutePath());
} else {
printDir2(file);
}
}
}
}
24
1
public class DiGuiDemo4 {
2
public static void main(String[] args) {
3
File dir = new File("D:\\aaa");
4
printDir2(dir);
5
}
6
7
public static void printDir2(File dir) {
8
// 匿名内部类方式,创建过滤器子类对象
9
File[] files = dir.listFiles(new FileFilter() {
10
11
public boolean accept(File pathname) {
12
return pathname.getName().endsWith(".java")||pathname.isDirectory();
13
}
14
});
15
// 循环打印
16
for (File file : files) {
17
if (file.isFile()) {
18
System.out.println("文件名:" + file.getAbsolutePath());
19
} else {
20
printDir2(file);
21
}
22
}
23
}
24
}
Lambda优化
public static void printDir3(File dir) {
// lambda的改写
File[] files = dir.listFiles(f ->{
return f.getName().endsWith(".java") || f.isDirectory();
});
// 循环打印
for (File file : files) {
if (file.isFile()) {
System.out.println("文件名:" + file.getAbsolutePath());
} else {
printDir3(file);
}
}
}
1
public static void printDir3(File dir) {
2
// lambda的改写
3
File[] files = dir.listFiles(f ->{
4
return f.getName().endsWith(".java") || f.isDirectory();
5
});
6
7
// 循环打印
8
for (File file : files) {
9
if (file.isFile()) {
10
System.out.println("文件名:" + file.getAbsolutePath());
11
} else {
12
printDir3(file);
13
}
14
}
15
}
<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">
Powers a lot like real estate.Its all about location, location, location.The closer you are to the source,the higher your property value.