本文参考自The Groovy Development Kit,一些代码直接引用了源文档。
Groovy开发工具包(The Groovy Development Kit)的名字一开始迷惑了我,我以为是一些IDE的插件之类的。在实际看了原文档之后,我才明白这是Groovy提供的一组类库和方法,让我们开发更加方便。
IO功能
在Java中读写文件非常麻烦。由于JDK类库设计问题,以及Java本身的局限性,导致Java自带的功能很不好用。比如说Java的读写流,使用了装饰器设计模式,原意是让我们能够自行组合各种流,实现功能。但是实际情况是这让类库变得很复杂,我们哪怕是简单读写文件也需要声明一个很长的嵌套流。
Groovy为JDK的很多类提供了很多助手方法,让文件读写变得异常简单。列举如下。如果需要查看完整的GDK文档,可以查看GDK API文档。
- the
java.io.File
class : http://docs.groovy-lang.org/latest/html/groovy-jdk/java/io/File.html - the
java.io.InputStream
class: http://docs.groovy-lang.org/latest/html/groovy-jdk/java/io/InputStream.html - the
java.io.OutputStream
class: http://docs.groovy-lang.org/latest/html/groovy-jdk/java/io/OutputStream.html - the
java.io.Reader
class: http://docs.groovy-lang.org/latest/html/groovy-jdk/java/io/Reader.html - the
java.io.Writer
class: http://docs.groovy-lang.org/latest/html/groovy-jdk/java/io/Writer.html - the
java.nio.file.Path
class: http://docs.groovy-lang.org/latest/html/groovy-jdk/java/nio/file/Path.html
读取文件
Groovy提供了非常方便的文件读写方式。而且在使用withXXX
方法或者闭包中抛出异常时,Groovy会自动关闭文件资源。所以我们可以放心的使用这些API。首先来看看文件读取。
Groovy为我们提供了丰富的功能。如果只需要简单读一个文件,简单的几行代码就可以做到。这些方法很简单,看代码就能知道怎么用。
static void readingFiles() {
def baseDir = /C:\Windows\System32\drivers\etc/
def filename = 'hosts'
//读取文件
def file = new File(baseDir, filename)
file.eachLine {
println(it)
}
//同时获取行号
file.eachLine { line, num ->
println("line $num:$line")
}
//获取字节流
byte[] contents = file.bytes
println(contents.join(''))
//获取行列表
String[] lines = file.collect { it }
println(lines.join('\n'))
//将文件用作输入流
file.withInputStream {
//在这里执行操作
}
}
写入文件
写文件和读文件一样简单。我们可以使用Writer来写文件。文件编码可以不指定,默认是UTF-8。
new File(baseDir,'haiku.txt').withWriter('utf-8') { writer ->
writer.writeLine 'Into the ancient pond'
writer.writeLine 'A frog jumps'
writer.writeLine 'Water’s sound!'
}
还可以使用左移操作符更简单的写文件,这种方式是追加方式。
new File(baseDir,'haiku.txt') << '这是一段文字'
还可以直接写入文件的字节流。
file.bytes = [66,22,11]