【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
}
  • PS: 记得将以下枚举导入到工程中
import static groovy.io.FileType.DIRECTORIES
import static groovy.io.FileType.FILES
import static groovy.io.FileType.ANY

处理指定后缀名的file

在这里插入图片描述

File topDir = new File('E:\\project\\placeholder-reader\\src\\top')

// 在多级目录中爬取指定后缀名的文件
topDir.eachFileRecurse(FILES) {
    if(it.name.endsWith('.groovy')) {
        println it.name
    }
}

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

在这里插入图片描述

  • 思路:先对文件进行递归,遇到了期望的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
        }
    }
}

递归处理 “排除” 的逻辑

在这里插入图片描述

  • 思路:先对文件夹进行递归,先获取期待的文件夹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
                }
            }
        }
    }
}

正则表达式相关的语法糖

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

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

  • matcher 证明text 可以命中pattern

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

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

后记

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值