Java基础 第四节 第十课

举报
我是小白呀iamarookie 发表于 2021/09/11 00:44:56 2021/09/11
【摘要】 综合案例 文件搜做分析代码展示 文件过滤器优化分析代码展示 Lambda 优化分析代码展示 文件搜做 搜索 C:/Users/Windows/Desktop 中的 .java ...

文件搜做

搜索 C:/Users/Windows/Desktop 中的 .java 文件.

分析

  1. 目录搜索, 无法判断多少级目录, 所以使用递归, 遍历所有目录
  2. 遍历目录时, 获取的子文件, 通过文件名称, 判断是否符合条件

代码展示

import java.io.File;

public class Test {
    public static void main(String[] args) {
        // 创建File对象
        File dir = new File("C:/Users/Windows/Desktop");
        // 调用打印目录方法
        printDir(dir);
    }

    private static void printDir(File dir) {
        // 获取子文件和目录
        File[] files = dir.listFiles();

        // 循环打印
        for (File file : files) {
            if (file.isFile()) {
                // 是文件, 判断出文件名并输出文件绝对路径
                if (file.getName().endsWith(".java")) {
                    System.out.println("文件名: " + file.getAbsolutePath());
                }
            } else {
                // 是目录, 继续变量, 形成递归
                printDir(file);
            }
        }
    }
}

输出结果:

文件名: C:\Users\Windows\Desktop\Amherst\LAB 4\AllEqual.java
文件名: C:\Users\Windows\Desktop\Amherst\LAB 4\Stars.java
文件名: C:\Users\Windows\Desktop\Amherst\LAB 5\Code-Student\NestedLoop.java
文件名: C:\Users\Windows\Desktop\Amherst\LAB 5\Code-Student\Purchase.java
文件名: C:\Users\Windows\Desktop\Amherst\LAB1_STUDENT\MyFirstProgram.java
文件名: C:\Users\Windows\Desktop\Amherst\LAB3 Code\Arithmeticx.java
文件名: C:\Users\Windows\Desktop\Amherst\LAB3 Code\FahrenheitToCelsiusx.java
文件名: C:\Users\Windows\Desktop\Amherst\LAB3 Code\MPGx.java

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39

文件过滤器优化

java.io.FileFilter是一个接口, 是 File 的过滤器. 该接口的对象可以传递给 FIle 类的 listFiles(FileFilter) 作为参数, 接口中只有一个方法:

boolean accept(File pathname) :
测试 pathname 是否应该包含在当前 File 目录中, 符合则返回 true

  
 
  • 1
  • 2

分析

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

代码展示

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

public class Test {
    public static void main(String[] args) {
        File dir = new File("C:/Users/Windows/Desktop");
        printDir2(dir);
    }

    private 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);
            }
        }
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

Lambda 优化

分析

分析: FileFilter 是只有一个方法的接口, 因此可以用 Lambda 表达式简写.

Lambda 格式:

()‐>{ }

  
 
  • 1

代码展示

import java.io.File;

public class Test {
    public static void main(String[] args) {
        File dir = new File("C:/Users/Windows/Desktop");
        printDir3(dir);
    }

    private static void printDir3(File dir) {
        // Lambda 改写
        File[] files = dir.listFiles((a) -> a.getName().endsWith(".java")||a.isDirectory());
        
        // 循环打印
        for(File file:files){
            if (file.isFile()){
                System.out.println("文件名: " + file.getAbsolutePath());
            }else{
                printDir3(file);
            }
        }
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

文章来源: iamarookie.blog.csdn.net,作者:我是小白呀,版权归原作者所有,如需转载,请联系作者。

原文链接:iamarookie.blog.csdn.net/article/details/111602943

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。