• 【Groovy】递归遍历文件,匹配/排除指定的文件


    前言

    Groovy 在 Java IO 上封装了一层实现,使得文件操作更加简单顺手。linux文件系统里面,文件有dir和file的区别,同样得,groovy在遍历文件的时候也有这种定义。为了满足递归获取dir下的所有file,groovy很友好的给出了ANY的类型表示即遍历dir,也遍历file。 值得注意的是,dir和file类型都由Java抽象成了 File

    /**
     * Represents particular files of interest.
     */
    public enum FileType {
        /** Represents normal files */
        FILES,
        /** Represents directories */
        DIRECTORIES,
        /** Represents both normal files and directories */
        ANY
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • PS: 记得将以下枚举导入到工程中
    import static groovy.io.FileType.DIRECTORIES
    import static groovy.io.FileType.FILES
    import static groovy.io.FileType.ANY
    
    • 1
    • 2
    • 3

    处理指定后缀名的file

    在这里插入图片描述

    File topDir = new File('E:\\project\\placeholder-reader\\src\\top')
    
    // 在多级目录中爬取指定后缀名的文件
    topDir.eachFileRecurse(FILES) {
        if(it.name.endsWith('.groovy')) {
            println it.name
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    处理指定目录下的所有文件

    在这里插入图片描述

    • 思路:先对文件进行递归,遇到了期望的DIRECTORIES则对该DIR进行ANY递归
    File topDir = new File('E:\\project\\placeholder-reader\\src\\top')
    
    // 只要first_dir目录下的所有文件
    topDir.eachFileRecurse(DIRECTORIES) {file ->
        if (file.name == 'first_dir') {
            file.eachFileRecurse(ANY) { innerFile ->
                println innerFile.name
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    递归处理 “排除” 的逻辑

    在这里插入图片描述

    • 思路:先对文件夹进行递归,先获取期待的文件夹first_dir,再递归中排除掉first_dir_second_dir,剩下的文件即是需要递归的文件
    File topDir = new File('E:\\project\\placeholder-reader\\src\\top')
    
    topDir.eachFileRecurse(DIRECTORIES) {file ->
        if (file.name == 'first_dir') {
            file.eachFileRecurse(DIRECTORIES) { innerDir ->
                if (innerDir.name != 'first_dir_first_dir') {
                    innerDir.eachFileRecurse { innerFile ->
                        println innerFile.name
                    }
                }
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    正则表达式相关的语法糖

    • 创建一个形如Java Pattern 的对象 (= 和 ~ 中间有一个空格)
      pattern = ~"[Gg]roovy"

    • 用 pattern 匹配 text, 获取 Matcher 对象
      matcher= text ~= 'Groovy is Hip'

    • matcher 证明text 可以命中pattern

      if (matcher) {
      	// 匹配成功
      }
      
      • 1
      • 2
      • 3
    • groovy 包了一层遍历实现, 可以把正则表达式中的分组信息依次遍历。形如 /(?=${)(${)(.*?)(?=})(})/ 匹配的三个分组都能依次遍历到
      matcher.each {println it}

    • 精确匹配
      matcher = text ~== 'Groovy is Hip'
      在这里插入图片描述

    后记

    想要递归文件的时候,记得可以递归嵌套递归,这样子几乎能实现大部分文件遍历的需求。

  • 相关阅读:
    推荐一款可以识别m3u8格式ts流批量下载并且合成mp4视频的chrome插件——猫抓
    KNN算法实现
    贝叶斯建模:从先验合理性到后验分布
    服务器主机托管一站式托管服务有哪些?
    Mac当作云服务器,你真的会搞吗
    jQuery常用API--选择器
    sed使用技巧-在replacement块获取pattern匹配的值
    【原创毕设程序】基于SSM的心理健康预约测试系统(SSM毕业设计程序)
    飞瞳引擎™集装箱AI检测云服务,集装箱信息识别功能免费,全球顶尖AI高泛化性,正常集装箱识别率99.98%,全球2000企业用户
    Spring中Bean的作用域和生命周期
  • 原文地址:https://blog.csdn.net/chenghan_yang/article/details/127455010