目录迭代
使用 Groovy 代替 shell 脚本(或批处理脚本)非常容易,因为您能够方便地访问文件系统。要获得当前目录的目录列表,参见清单 21:
清单 21. 目录迭代
def dir = new File(".")
dir.eachFile{file->
println file
}
dir.eachFile{file->
println file
}
eachFile() 方法同时返回了文件和子目录。使用 Java 语言的 isFile() 和 isDirectory() 方法,可以完成更复杂的事情。清单 22 展示了一个例子:
清单 22. 分离文件和目录
def dir = new File(".")
dir.eachFile{file->
if(file.isFile()){
println "FILE: ${file}"
}else if(file.isDirectory()){
println "DIR: ${file}"
}else{
println "Uh, I'm not sure what it is..."
}
}
dir.eachFile{file->
if(file.isFile()){
println "FILE: ${file}"
}else if(file.isDirectory()){
println "DIR: ${file}"
}else{
println "Uh, I'm not sure what it is..."
}
}
由于两种 Java 方法都返回 boolean 值,可以在代码中添加一个 Java 三元操作符。清单 23 展示了一个例子:
清单 23. 三元操作符
def dir = new File(".")
dir.eachFile{file->
println file.isDirectory() ? "DIR: ${file}" : "FILE: ${file}"
}
dir.eachFile{file->
println file.isDirectory() ? "DIR: ${file}" : "FILE: ${file}"
}
如果只对目录有兴趣,那么可以使用 eachDir() 而不是 eachFile()。还提供了 eachDirMatch() 和 eachDirRecurse() 方法。
可以看到,对 File 仅使用 each() 方法并不能提供足够的含义。典型 each() 方法的语义保存在 File 中,但是方法名更具有描述性,从而提供更多有关这个高级功能的信息。