前言
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'
后记
想要递归文件的时候,记得可以递归嵌套递归,这样子几乎能实现大部分文件遍历的需求。