Java中File类与递归

File类

File类是文件目录路径抽象表示,主要用于文件和目录创建/查找/删除等操作

1. 构造方法

a File(String path) : 通过将给定的路径字符串转换为抽象路径名来创建 file 实例
b File(String FatherPath, String SonPath): 从父路径名字字符串和子路径字符串创建新的 File 实例
c File(File FatherPath, String Sonpath) : 从抽象路径名和子路径名字字符串创建新的 File 实例
如:

   		//文件路径名
        String pathname = "D:\\zzz.txt";
        File fileone = new File(pathname);
        
        //通过父路径和子路径字符串
        String fpath = "D:\\aaa";
        String spath = "ccc.txt";
        File filetwo = new File(fpath,spath);
        
        //通过父级 File 对象和子路径字符串
        File fatherdir = new File("d:\\aaa");
        String sonpath = "bbb.txt";
        File filethree = new File(fatherdir,sonpath);

2. 常用方法

getAbsolutePath() : 返回此File 的绝对路径字符串;
getpath(): 将File 转换为路径名字字符串
getName() : 返回由此 File 表示的文件或目录的名称
length() : 返回由此Fiel 表示的文件的长度

import java.io.File;
public class FileDemoTwo {
    public static void main(String[] args){
        File file = new File("d://aaa/bbb.txt");
        System.out.println("绝对路径:" + file.getAbsolutePath());
        System.out.println("文件目录路径: "+ file.getPath());
        System.out.println("文件或目录的名称: " + file.getName());
        System.out.println("文件长度: " + file.length() + "字节");

        File filetwo = new File("D://aaa");
        System.out.println("绝对路径: " + filetwo.getAbsolutePath());
        System.out.println("文件目录路径:" + filetwo.getPath());
        System.out.println("文件或目录的名称: " + filetwo.getName());
        System.out.println("目录长度: " + filetwo.length());
    }
}

输出:
在这里插入图片描述

3. 绝对路径与相对路径

绝对路径: 包括盘符一整个路径
相对路径: 相对于项目的路径

import java.io.File;
public class AbsolutelyRelativeDemo {
    public static void main(String[] args){
        //G盘下的 ccc.java文件  //绝对路径
        File fileone = new File("G:\\ccc.java");
        System.out.println(fileone.getAbsoluteFile());

        //项目下的 bbb.java文件  //相对路径
        File filetwo = new File("bbb.java");
        System.out.println(filetwo.getAbsoluteFile());
    }
}

输出:
在这里插入图片描述

4. 判断功能的方法

exists() : 表示文件或目录是否存在
isDirectory() : 表示是否为目录
isFile() : 表示是否为文件

import java.io.File;

public class FileEstimateDemo {
    public static void main(String[] args){
        File file1 = new File("G:\\ccc.java");
        File file2 = new File("G:\\aaa_project\\bbb.java");

        //判断是否存在
        System.out.println("判断file1是否存在: " + file1.exists());
        System.out.println("判断file2是否存在: " + file2.exists());

        //判断是否是文件
        System.out.println("判断file1是否是文件: " + file1.isFile());

        //判断是否是目录
        System.out.println("哦安短files是否是目录: " + file2.isDirectory());
    }
}

输出:
在这里插入图片描述

5. 创建与删除

createmNewFile() : 创建文件不存在时创建一个空的新文件
delete() : 删除由此 File 表示的文件或目录
mkdir():创建一个目录
mkdirs() : 创建由此File 表示的目录,包括任何必须但不存在的父目录

import java.io.File;
import java.io.IOException;

public class MakeFileandDir {
    public static void main(String[] args) throws IOException {
        //创建文件
        File makefile = new File("G:\\ddd.txt");
        //判断是否存在
        System.out.println(makefile.exists()); //false
        //创建文件
        makefile.createNewFile();
        //判断是否存在(是否已经创建好)
        System.out.println(makefile.exists());//创建文件   //true

        //创建目录
        File makedir = new File("G:\\fff");
        //判断是否存在
        System.out.println(makedir.exists()); //false
        //创建目录
        makedir.mkdir();
        //判断是否存在(是否已经创建好)
        System.out.println(makedir.exists()); //truw

        //创建多级目录
        File makedirs = new File("G:\\ggg\\hhh");
        //创建目录
        makedir.mkdirs();//使用mkdir() 的话会失败

        //文件删除
        System.out.println(makefile.delete()); //true

        //删除目录
        System.out.println(makedir.delete()); //true
        System.out.println(makedirs.delete()); //false  //空的才可以被删除
    }
}

注意: delete方法,如果是目录,则目录必须是空的才能删除

6. 目录的遍历

list() : 返回一个String 数组,表示 File 目录中所有子文件或目录
listFiles() : 返回一个File数组, 表示 File 目录中的所有的子文件或目录

import java.io.File;
public class TraverseFileDemo {
    public static void main(String[] args){
        File fileone = new File("G:\\aaa_project");
        //文件夹结构: G:\aaa_project\bbb.java
        // G:\aaa_project\ccc\ddd.txt

        //获取当前目录下的文件及文件夹名称
        String[] nee = fileone.list();
        for(String s : nee){
            System.out.println(s);
        }
        System.out.println("------------- 分界 -------------");
        //获取当前目录下的文件及文件夹对象,只要拿到了文件对象,那么就可以获取更多信息
        File[] files= fileone.listFiles();
        for (File file : files){
            System.out.println(file);
        }
    }
}

输出:
在这里插入图片描述

递归

1. 递归的了解

递归:方法内调调用自己
递归分类:
直接递归:方法自身调用自己
简介递归:A方法调用BB方法,B方法调用C方法,C方法调用A方法
注意:
递归要有一定条件,保证递归能够停下来,否则会发生栈内存溢出
在递归中虽然有一定体哦阿健,但是递归次数不能太多,否则也会发生内存溢出
构造方法禁止递归

public class RecursionTest {
    public static void main(String[] args){
        //a(); 报错没有一定的限定条件,会造成栈内存溢出
        b(1);
    }
    private static void b(int i){
        System.out.println(i);
        if(i==5000){
            return;
        }
        b(++i);
    }
    private static void a(){
        System.out.println("a方法");
        a();
    }
}

++i 与 i++ 的区别
i++ 先赋值再运算
++i 先运算赋赋值
如:

public class TestOne {
    public static void main(String[] args){
        int i=1, a=0;
        int j=1, b=0;
        
        a = i++;
        //先赋值 a=i ,后运算 i = i + 1,所以结果为1
        System.out.println(a); //1

        b = ++j;
        //先运算 j = j + 1,后赋值 b=j,所以结果为2
        System.out.println(b); //2
    }
}

输出:
在这里插入图片描述

2. 递归的使用

2.1 递归累加求和
计算 1 到 100 的累加和

public class SunDemoOne {
    public static void main(String[] args){
        //计算 1 - 100 的和
        int num = 100;
        int sums = sum(num);
        System.out.println(sums);
    }
    
    public static int sum(int num){
        if(num == 1){
            return 1;
        }
        return num + sum(num - 1 );
    }
}

输出:
在这里插入图片描述
2.1 递归求阶乘
求5的阶乘

public class foctDemo {
    public static void main(String[] args) {
        int num = 5;
        System.out.println(getnum(num));
    }
    public static int getnum(int num){
        if (num == 1){
            return 1;
        }
        return num * getnum(num -1);
    }
}

输出:
在这里插入图片描述

3. 使用递归打印多级目录

import java.io.File;
/*
文件夹结构:     G:\aaa_project\bbb.java
            G:\aaa_project\ccc\ddd.txt
*/
public class DiguiFiel {
    public static void main(String[] args){
        //创建File 对象
        File filename = new File("G:\\aaa_project");
        printDirname(filename);
    }
    public static void printDirname(File filename){
        File[] files = filename.listFiles();
        for (File file : files){
            if(file.isFile()){
                //如果是文件输出其 绝对路径
                System.out.println("文件名: " + file.getAbsolutePath());
            }else {
                //答打印目录的聚堆路径
                System.out.println("目录: " + file.getAbsolutePath());
               //调用自己,继续遍历,以形成递归
                printDirname(file);
            }
        }
    }
}

输出:
在这里插入图片描述

文件搜索

如搜索: G:\aaa_project 中的 .java 文件


import java.io.File;

public class selectFiles {
    public static void main(String[] args){
        //创建 File 对象
        File file = new File("G:\\aaa_project");
        printFilename(file);
    }

    public static void printFilename(File file){
        //获取文件和目录
        File[] dirs = file.listFiles();

        for(File dir : dirs){
            if (dir.getName().endsWith(".java")){
                System.out.println("文件名: "+ dir.getAbsolutePath());
            }else {
                try {
                    printFilename(dir);
                }catch (Exception e){
                    throw new NullPointerException("搜索完毕,未搜索到其他 .java为后缀的其他文件");
                }
            }
        }
    }
}

输出:
在这里插入图片描述
其中的

endsWith() 方法用于测试字符串是否以指定的后缀结束

文件过滤器优化

FileFilter 是一个接口,是File 的过滤器,该接口的对象可以传递给File 类的 ListFiles(FileFilter) 作为参数,接口中只有一个方法.
boolean accept(File pathname) ; cehsi pathname : 测试当前 File 是否应该包含在当前File 目录中,符合则返回 True
1. 接口作为参数,需要传递子类对象,重写其方法,可以选择匿名内部类的方式,比较简单
2. accept 方法,参数 File ,表示当前 File 下所有的子文件和子目录, 保留住则返回 true,过滤掉则返回 false
保留规则:
1. 要么是java 文件
2. 要么是目录,用于继续遍历
3. 通过过滤器的作用 listFiles(FileFilter) 返回数组元素中,子文件对像都是符合条件的,可以直接打印

import java.io.File;
import java.io.FileFilter;

public class fielTestDemothree {
    public static void main(String[] args){
        File dir = new File("G:\\aaa_project");
        printfilebnane(dir);
    }
    public static void printfilebnane(File dir){
        //匿名内部类方式,创建过滤器子类对象
        File[] files = dir.listFiles(new FileFilter() {
            @Override
            public boolean accept(File pathname) {
                return pathname.getName().endsWith(".java") || pathname.isDirectory();
            }
        });
        //循环打印
        for (File fil : files) {
            if(fil.isFile()){
                System.out.println("文件名:" + fil.getAbsolutePath());
            }else {
                printfilebnane(fil);
            }
        }

    }
}

输出:
在这里插入图片描述
可以使用 Lambda表达式优化上面的代码

import java.io.File;
public class LambdaFiledDemo {
    public static void main(String[] args){
        File dir = new File("G:\\aaa_project");
        printfilebnane(dir);
    }
    public static void printfilebnane(File dir){
        //匿名内部类方式,创建过滤器子类对象
        File[] files = dir.listFiles(f ->{
            return f.getName().endsWith(".java") || f.isDirectory();
        });
        //循环打印
        for (File fil : files) {
            if(fil.isFile()){
                System.out.println("文件名:" + fil.getAbsolutePath());
            }else {
                printfilebnane(fil);
            }
        }
    }
}

输出:
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值