1. eachLine -- 打开和读取文件的每一行
new File("foo.txt").eachLine { println it.toUpperCase(); }
2. readLines -- 其作用基本与 eachLine 相同,但它不接受闭包为参数,而是把文件行读到一个 List 中
lineList = new File("foo.txt").readLines(); lineList.each { println it.toUpperCase(); }
3. splitEachLine -- 读取文件的每一行,然后对行以指定分隔符分割成数组。不用再多说了,这个方法对处理 CSV 文件那可是相当的高效。
lineList = new File("foo.csv").splitEachLine(",") { println "name=${it[0]} balance=${it[1]}"; }
4. eachByte -- 处理二进制文件,以字节级访问文件,这个方法相当于 eachLine() 方法。
new File("foo.bin").eachByte { print it; }
5. readBytes -- 自然,处理二进制文件,以字节级访问文件,这个方法相当于 readLines() 方法了
byteList = new File("foo.bin").readBytes(); byteList.each { println it; }
6. write -- Groovy 用这个方法写文件真是太直观了
new File("foo.txt").write("testing testing"); new File("foo.txt").write(""" This is just a test file to play with """);
以上使用了三重引用语法,其中的文本保留格式的写入到文件中。注意上面写法在文件首尾都会有一个空行,除非起始和结束字符都要紧贴 """;还有上面方法写的文件用词本打开会是挤在一行,用 editplus 打开是多行,因为它采用的是 linux 下的 /n 换行,而不是 windows 下的 /r/n 换行。、
7. append -- 与 write 覆写文件不同,append 是在文件后追加内容
new File("foo.txt").append("""/ This is just a test file to play withff """ );
8. eachFile -- 功能上类似 java.io.File 的 listFiles() 方法。用来列举路径中的每个文件(包括目录),传给闭包处理
new File(".").eachFile { //这里的 File 表示的是一个路径 println it.getName(); //eachFile() 列出的每一项是一个 File 实例 }
9. eachFileRecurse -- 以深度优先的方式递归遍历路径,列出文件(包括目录),传给闭包处理
new File(".").eachFileRecurse { //这里的 File 表示的是一个路径 println it.getPath(); //eachFile() 列出的每一项是一个 File 实例 }
10. …… 再重复一下,其他 Groovy 对 java.io.File 的扩展方法请参考 http://groovy.codehaus.org/groovy-jdk/java/io/File.html。
如
eachDir()、eachDirMatch()、eachDirRecurse()、eachFileMatch()、filterLine()、
newInputStream()、newOutputStream()、newReader()、newPrintWriter()、
withInputStream()、withOutputStream()、withReader()、withPrintWriter()
等等。还要留意一下有一些方法是可以指定字符集的。
----
操作目录
列出目录所有文件(包含子文件夹,子文件夹内文件) :
def dir = new File(dirName) if (dir.isDirectory()) { dir.eachFileRecurse { file -> println file } } dir.eachFileMatch(~/.*\.txt/) {File it-> println it.name } //使正则表达式匹配文件名 dir.eachFileMatch(FILES, ~/.*\.txt/) { File it-> println it.name }
写文件
import java.io.File def writeFile(fileName) { def file = new File(fileName) if (file.exists()) file.delete() def printWriter = file.newPrintWriter() // printWriter.write(‘The first content of file‘) printWriter.write(‘\n‘) printWriter.write(‘The first content of file‘) printWriter.flush() printWriter.close() }
除了 file.newPrintWriter()
可以得到一个 PrintWriter,类似方法还有 file.newInputStream()
、
file.newObjectInputStream()
等。
更简洁写法:
new File(fileName).withPrintWriter { printWriter -> printWriter.println(‘The first content of file‘) }
解析 xml 文件
<?xml version="1.0" encoding="UTF-8"?> <customers> <corporate> <customer name="bill gates" company="microsoft"></customer> <customer name="steve jobs" company="apple"></customer> <customer name="bill dyh" company="sun"></customer> </corporate> <consumer> <customer name="jone Doe"></customer> <customer name="jane Doe"></customer> </consumer> </customers>
def customers = new XmlSlurper().parse(new File("customers.xml")) /*对文件进行解析*/ for(customer in customers.corporate.customer){ println "${[email protected]} works for${[email protected]}"; }
解析 propeties 文件
参考 groovy: How to access to properties file?,代码如下:
def props = new Properties() new File("message.properties").withInputStream { stream -> props.load(stream) } // accessing the property from Properties object using Groovy‘s map notation println "capacity.created=" + props["capacity.created"] def config = new ConfigSlurper().parse(props) // accessing the property from ConfigSlurper object using GPath expression println "capacity.created=" + config.capacity.created
另外一种方式:
def config = new ConfigSlurper().parse(new File("message.groovy").toURL())
message.groovy 内容如下:
capacity { created="x" modified="y" }