当前位置: 首页 > news >正文

FileFilter过滤器

如打印多级目录下所有以.java结尾的文件,常规递归做法:

/*
练习:递归打印多级目录
需求:遍历D:\\a文件及,及a文件夹下的子文件夹
只要.java结尾的文件
 */
public class Demo13FileFilter {
    public static void main(String[] args) {
        File dir = new File("D:\\a");
        getAllFile(dir);
    }
        /*
        定义一个方法,参数传递File类型的目录
         */
        public static void getAllFile(File dir){
            File[] files = dir.listFiles();
            for (File file : files) {
                if(file.toString().endsWith(".java")) {
                    System.out.println(file);
                }
                if(file.isDirectory()){
                    getAllFile(file);
                }
            }
        }
}

在File类中有两个和ListFiles重载的方法,方法传递的参数就是过滤器。

 File[]listFiles()
          返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。
 File[]listFiles(FileFilter filter)
          返回抽象路径名数组,这些路径名表示此抽象路径名表示的目录中满足指定过滤器的文件和目录。
 File[]

listFiles(FilenameFilter filter)
          返回抽象路径名数组,这些路径名表示此抽象路径名表示的目录中满足指定过滤器的文件和目录。

FileFilter接口

java.io.FileFilter是用于抽象路径名(就是File对象)的过滤器。

作用:过滤文件(File对象)的。

抽象方法:

booleanaccept(File pathname)
          测试指定抽象路径名是否应该包含在某个路径名列表中。

参数:pathname:使用ListFiles方法遍历目录,得到的每一个文件对象。

 

FilenameFilter接口

实现java.io.FilenameFilter接口的类实例可以用于过来文件名。

作用:过滤文件(File对象)名称的。

抽象方法:

booleanaccept(File dir, String name)
          测试指定文件是否应该包含在某一文件列表中。

参数:dir:构造方法中传递的被遍历的目录;name:使用ListFiles方法遍历目录,获取的每一个文件/文件夹的名称

注意事项:

两个过滤器接口没有实现类的,需要自己写实现类,重写过滤的方法accept,在方法中自己定义过滤规则。

 FileFilter过滤器原理:

代码实现:

/*
创建过滤器FileFilter的实现类,重写过滤方法accept,定义过滤规则
 */
public class FileFilterImpl implements FileFilter {
    @Override
    public boolean accept(File pathname) {
        // pathname:使用ListFiles方法遍历目录,得到的每一个文件对象。
        if(pathname.toString().endsWith(".java") || pathname.isDirectory())
            return true;
        else
            return false;
    }
}
public static void main(String[] args) {
        File dir = new File("D:\\a");
        getAllFile(dir);
    }
        /*
        定义一个方法,参数传递File类型的目录
         */
        public static void getAllFile(File dir){
            File[] files = dir.listFiles(new FileFilterImpl()); // 传递过滤器对象
            for (File file : files) {
               // if(file.toString().endsWith(".java")) {
                    System.out.println(file);
                // }
                if(file.isDirectory()){
                    getAllFile(file);
                }
            }
        }
}

优化1--匿名内部类

public static void main(String[] args) {
    File dir = new File("D:\\a");
    getAllFile(dir);
}
/*
定义一个方法,参数传递File类型的目录
 */
public static void getAllFile(File dir){
    File[] files = dir.listFiles(new FileFilter(){
        @Override
        public boolean accept(File pathname) {
            if(pathname.toString().endsWith(".java") || pathname.isDirectory())
                return true;
            else
                return false;
        }
    }); // 传递过滤器对象
    for (File file : files) {
        // if(file.toString().endsWith(".java")) {
        System.out.println(file);
        // }
        if(file.isDirectory()){
            getAllFile(file);
        }
    }
}

优化2--Lambda表达式 前提:只有一个抽象方法。

public static void main(String[] args) {
    File dir = new File("D:\\a");
    getAllFile(dir);
}
/*
定义一个方法,参数传递File类型的目录
 */
public static void getAllFile(File dir){
    File[] files = dir.listFiles((File pathname)-> {
        if(pathname.toString().endsWith(".java") || pathname.isDirectory())
            return true;
        else
            return false;
    }); // 传递过滤器对象
    for (File file : files) {
        // if(file.toString().endsWith(".java")) {
        System.out.println(file);
        // }
        if(file.isDirectory()){
            getAllFile(file);
        }
    }
}

相关文章:

  • LeetCode两数之和
  • 稀疏数组
  • 队列
  • 单链表LinkedList的增删改查
  • 双向链表和环形链表(单向和双向)约瑟夫环实例
  • IO流概述+字节输出流
  • 字节输入流
  • 字符流(字符输入流和字符输出流)
  • IO异常的处理
  • 栈Stack(数组模拟、单链表模拟)
  • 属性集合Properties
  • 缓冲流
  • 转换流InputStreamReader类和OutputStreamWriter(字符编码和字符集)
  • 序列化与反序列化和transient瞬态关键字
  • 打印流
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • HTML5新特性总结
  • HTTP--网络协议分层,http历史(二)
  • java多线程
  • JAVA之继承和多态
  • PHP 7 修改了什么呢 -- 2
  • spring学习第二天
  • Vim Clutch | 面向脚踏板编程……
  • vue-router 实现分析
  • vue--为什么data属性必须是一个函数
  • 产品三维模型在线预览
  • 从 Android Sample ApiDemos 中学习 android.animation API 的用法
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 关于springcloud Gateway中的限流
  • 基于组件的设计工作流与界面抽象
  • 使用前端开发工具包WijmoJS - 创建自定义DropDownTree控件(包含源代码)
  • 算法系列——算法入门之递归分而治之思想的实现
  • 一些css基础学习笔记
  • 异常机制详解
  • 在weex里面使用chart图表
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • ​2020 年大前端技术趋势解读
  • ​无人机石油管道巡检方案新亮点:灵活准确又高效
  • ​用户画像从0到100的构建思路
  • # 透过事物看本质的能力怎么培养?
  • #if 1...#endif
  • #数学建模# 线性规划问题的Matlab求解
  • (14)Hive调优——合并小文件
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第2节(共同的基类)
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (iPhone/iPad开发)在UIWebView中自定义菜单栏
  • (Redis使用系列) SpringBoot中Redis的RedisConfig 二
  • (ros//EnvironmentVariables)ros环境变量
  • (大众金融)SQL server面试题(1)-总销售量最少的3个型号的车及其总销售量
  • (附源码)springboot建达集团公司平台 毕业设计 141538
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • (转)微软牛津计划介绍——屌爆了的自然数据处理解决方案(人脸/语音识别,计算机视觉与语言理解)...
  • .NET 解决重复提交问题