File类递归
---恢复内容开始---
File类
概述;
java.io.File类是文件和目录路径的抽象表示,主要用于文件和目录的创建,查找和删除等操作
|
构造方法:
public File(String pathname) :通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。 public File(String parent, String child) :从父路径名字符串和子路径名字符串创建新的 File实例。public File(File parent, String child) :从父抽象路径名和子路径名字符串创建新的 File实例。 |
案例:
package com.heima.biji;
import java.io.File;
public class Demo02 {
public static void main(String[] args) {
//public File(String pathname) :
// 通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。
String pathname="D:\\LULIANGHM";
File file=new File(pathname);
System.out.println(file);
//文件路径名path路径
File file1=new File("D:\\LULIANGHM\\JAVAEE\\Day01\\out\\production\\Day09");
System.out.println(file1);
// 通过父级File对象和子路径字符串
File file2=new File("D:\\LULIANGHM\\JAVAEE\\Day10");
System.out.println(file2);
File file3=new File(file2,"bbb.txt");
}
}
注意:1.一个File对象代表硬盘中实际存在的一个文件或者目录.
2.无论该路径下是否存在文件或者目录,都不影响File的创建.
获取功能的方法
public String getAbsolutePath() :返回此File的绝对路径名字符串。public String getPath() :将此File转换为路径名字符串。public String getName() :返回由此File表示的文件或目录的名称。 public long length() :返回由此File表示的文件的长度。 |
演示:
private static void day02() {
File file=new File("D://LULIANGHM");
System.out.println("目的绝对路径:"+file.getAbsolutePath());
System.out.println("目件的构造路径:"+file.getPath());
System.out.println("目件名称:"+file.getName());
System.out.println("目件长度:"+file.length());//4096错误
//文件路径和上面一样
}
判断功能的方法:
public boolean exists() :此File表示的文件或目录是否实际存在。public boolean isDirectory() :此File表示的是否为目录。public boolean isFile() :此File表示的是否为文件。 |
演示:
public class FileIs {
public static void main(String[] args) {
File f = new File("d:\\aaa\\bbb.java");
File f2 = new File("d:\\aaa");
// 判断是否存在
System.out.println("d:\\aaa\\bbb.java 是否存在:"+f.exists());
System.out.println("d:\\aaa 是否存在:"+f2.exists());
// 判断是文件还是目录
System.out.println("d:\\aaa 文件?:"+f2.isFile());
System.out.println("d:\\aaa 目录?:"+f2.isDirectory());
}
}
输出结果:
d:\aaa\bbb.java 是否存在:true
d:\aaa 是否存在:true
d:\aaa 文件?:false
d:\aaa 目录?:true
创建删除的方法:
public boolean createNewFile() :当且仅当具有该名称的文件尚不存在时,创建一个新的空文件。public boolean delete() :删除由此File表示的文件或目录。 public boolean mkdir() :创建由此File表示的目录。public boolean mkdirs() :创建由此File表示的目录,包括任何必需但不存在的父目录。 |
演示:
package com.heima.biji;
import java.io.File;
import java.io.IOException;
public class FileCreateDelete {
public static void main(String[] args) throws IOException {
// 文件的创建
File f = new File("D:aaa.txt");
System.out.println("是否存在:"+f.exists()); // false
System.out.println("是否创建:"+f.createNewFile()); // true
System.out.println("是否存在:"+f.exists()); // true
// 目录的创建
File f2= new File("newDir");
System.out.println("是否存在:"+f2.exists());// false
System.out.println("是否创建:"+f2.mkdir()); // true
System.out.println("是否存在:"+f2.exists());// true
// 创建多级目录
File f3= new File("newDira\\newDirb");
System.out.println(f3.mkdir());// false
File f4= new File("newDira\\newDirb");
System.out.println(f4.mkdirs());// true
// 文件的删除
System.out.println(f.delete());// true
// 目录的删除
System.out.println(f2.delete());// true
System.out.println(f4.delete());// false
}
}
注意:delete方法,如果此File表示目录,则目录必须为空才能删除.
目录的遍历:
public File[] listFiles() :返回一个File数组,表示该File目录中的所有的子文件或目录。 |
演示:
package com.heima.biji;
import java.io.File;
//目录的遍历
public class Demo04 {
public static void main(String[] args) {
File file = new File("D:\\LULIANGHM");
//获取当前目录下文件以及文件夹的名称
String[] name = file.list();
for (String s : name) {
System.out.println(s);
}
//获取当前目录下的文件以及文件夹对象,只要拿到了文件对象,那么就可以获取更多信息
File[] lu = file.listFiles();
for (File file2 : lu) {
System.out.println(file2);
}
}
}
注意:调用listFiles方法的File对象,表示的必须是实际存在的目录,否则会返回null,无法进行遍历.
绝对路径,和相对路径
- 绝对路径:从盘符开始的路径,这是一个完整的路径
- 相对路径:相对于项目目录的路径,这是一个便捷的路径,开发中经常使用
演示:
private static void day03() {
//D盘上的文件
File file=new File("D:\\bbb.java");
System.out.println(file.getAbsolutePath());
//项目上的文件
File file1=new File("LULIANGHM\\JAVAEE\\Day01.java");
System.out.println(file1.getAbsolutePath());
}
//D盘上的文件
File file=new File("D:\\bbb.java");
System.out.println(file.getAbsolutePath());
//项目上的文件
File file1=new File("LULIANGHM\\JAVAEE\\Day01.java");
System.out.println(file1.getAbsolutePath());
}
递归:
概述:指当前方法的内调用自己的这种现象.
如:
public stattic void main(String [] args){
System.out.println("main");
main(args);
}
递归题目实现和
题目分析; num的累和 = num + (num-1)的累和,所以可以把累和的操作定义成一个方法,递归调用。
package com.heima.biji;
//求和
public class Demo05 {
public static void main(String[] args) {
//计算和
int num=0;
System.out.println(getSum(2));
}
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);
}
}
执行代码图:
实现阶乘:
题目分析: 这与累和类似,只不过换成了乘法运算,学员可以自己练习,需要注意阶乘值符合int类型的范围。
得出结论:n!=n*(n-1)!
代码:
package com.heima.biji;
//阶乘
public class Demo06 {
public static void main(String[] args) {
int num=0;
System.out.println(lu(3));
}
//参数类型:int 返回值类型:int
public static int lu(int num){
//num=1跳出递归
if(num==1){
return 1;
}
return num*lu(num-1);
}
}
实现打印多级目录:
分析: 多级目录的打印,就是当目录的嵌套。遍历之前,无从知道到底有多少级目录,所以我们还是要使用递归实现。
package com.heima.biji;
import java.io.File;
public class Demo07 {
public static void main(String[] args) {
//创建File对象
File dir=new File("D:\\LULIANGHM");
lu(dir);
}
public static void lu(File dir){
//获取打印目录的方法
File [] files=dir.listFiles();
//循环打印
/*
判断:
当是文件时,打印绝对路径.
当是目录时,继续调用打印目录的方法,形成递归调用.
*/
for (File file : files) {
//判断
if(file.isFile()){
//是文件.java输出文件的绝对路径
//isFile:此File表示的是否为文件。
//getAbsolutePath:返回此File的绝对路径名字符串
System.out.println("文件名:"+file.getAbsolutePath());
}else {
//是目录暑促露露的绝对路径
System.out.println("目录:"+file.getAbsolutePath());
lu(file);//递归循环
}
}
}
}
实现文件搜索:
分析:
目录搜索,无法判断多少级目录,所以使用递归,遍历所有目录。
遍历目录时,获取的子文件,通过文件名称,判断是否符合条件。
代码:
public class Demo08 {
public static void main(String[] args) {
File dir=new File("D:\\LULIANGHM");
lu(dir);
}
public static void lu(File dir){
//获取子文件或者目录方法
File [] files=dir.listFiles();
//循环打印
for (File file : files) {
//判断
if(file.isFile()){
//再次判断如果是文件,判断文件名并输出文件绝对路径
//isFile:此File是否是文件
//getName:返回由此File表示的文件或目录的名称
//endsWith:以什么为结尾.
if(file.getName().endsWith(".java")){
System.out.println("文件名:"+file.getAbsolutePath());
}
}else {
//是目录
lu(file);
}
}
}
}
文件过滤器:
分析:
java.io.FileFilter
是一个接口,是File的过滤器。 该接口的对象可以传递给File类的listFiles(FileFilter)
作为参数, 接口中只有一个方法。boolean accept(File pathname)
:测试pathname是否应该包含在当前File目录中,符合则返回true。
接口作为参数,需要传递子类对象,重写其中方法。我们选择匿名内部类方式,比较简单。
accept 方法,参数为File,表示当前File下所有的子文件和子目录。保留住则返回true,过滤掉则返回false。保留规则:要么是.java文件。要么是目录,用于继续遍历。通过过滤器的作用,
listFiles(FileFilter) 返回的数组元素中,子文件对象都是符合条件的,可以直接打印。 |
代码:
package com.heima.biji;
import java.io.File;
import java.io.FileFilter;
public class Demo09 {
public static void main(String[] args) {
//创建File对象
File dir=new File("D:\\LULIANGHM");
lu(dir);
}
public static void lu(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 {
lu(file);
}
}
}
}
Lambda优化:
分析:
Lambda格式:
代码实现;
package com.heima.biji;
import java.io.File;
public class Demo10 {
public static void main(String[] args) {
File dir=new File("D:\\LULIANGHM");
lu(dir);
}
public static void lu(File dir){
//lambda的改写
//isDirectory:此File表示的是否为目录。
//f.getName().endsWith(".java"):获取以此.java文件结尾的文件
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 {
lu(file);
}
}
}
}
---恢复内容结束---