File类,递归和过滤器

File类,递归和过滤器

一:File类

1.1:FIle类的介绍

File类是Java操作计算机里面的文件和文件夹,并且该类的对象可以对文件和文件夹进行一系列的操作
File:文件;  Path:路径;  Directory:目录

1.2:File类的构造方法

概述:
	有四种方式可以用来创建File类对象(可以根据相对地址和绝对地址)。

例子(创建对象):
  File(String pathname)   //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类代表电脑上的文件,可以对文件进行以一系列的操作。
然后学习怎样用递归
在找文件夹下的文件和文件夹,引出过滤器
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值