Unmi 学习 Groovy 之文件操作

一:Java 与 Groovy 读文件操作比较

Groovy 对 java.io.File 进行了扩展,增加了一些接受闭包参数和简化文件操作的方法。作为对比,我们还是先来看看 java 中读取文件的两种常方法,分别是行读取和字节缓冲区读取:

从上面可看到,采用 Java 传统方式来读取文件内容,不仅代码行多,而且还必须自己用 try/catch/finally 来处理异常和资源的关闭。现在马上来看看 Groovy 完成以上工作的代码是怎么的,只要一行代码:

不需要 Reader 或 Inputstream、不用关闭语名和异常处理。我们所要做的就是编写业务逻辑,剩下的工作 Groovy 会帮你料理的。当然,如果文件找不到,也是会出现 java.io.FileNotFoundException 异常的。你可以捕获这个要处理的异常,但仍然不必担心资源的释放。

至于写文件,Groovy 的表现也比较抢眼。下面我们来体验一下 Groovy 对 java.io.File 扩展的几个方法的使用。关于 File 的所有扩展方法的使用请参考 Groovy JDK -- https://groovy-lang.org/gdk.html) 中 java.io.File(https://docs.groovy-lang.org/latest/html/groovy-jdk/java/io/File.html) 部分。

二:Groovy 对 java.io.File 扩展方法举例

1. eachLine -- 打开和读取文件的每一行

2. readLines -- 其作用基本与 eachLine 相同,但它不接受闭包为参数,而是把文件行读到一个 List 中

3. splitEachLine -- 读取文件的每一行,然后对行以指定分隔符分割成数组。不用再多说了,这个方法对处理 CSV 文件那可是相当的高效。

4. eachByte -- 处理二进制文件,以字节级访问文件,这个方法相当于 eachLine() 方法。

5. readBytes -- 自然,处理二进制文件,以字节级访问文件,这个方法相当于 readLines() 方法了

6. write -- Groovy 用这个方法写文件真是太直观了

以上使用了三重引用语法,其中的文本保留格式的写入到文件中。注意上面写法在文件首尾都会有一个空行,除非起始和结束字符都要紧贴 """;还有上面方法写的文件用词本打开会是挤在一行,用 editplus 打开是多行,因为它采用的是 linux 下的 \n 换行,而不是 windows 下的 \r\n 换行。、

7. append -- 与 write 覆写文件不同,append 是在文件后追加内容

8. eachFile -- 功能上类似 java.io.File 的 listFiles() 方法。用来列举路径中的每个文件(包括目录),传给闭包处理

9. eachFileRecurse -- 以深度优先的方式递归遍历路径,列出文件(包括目录),传给闭包处理

10. …… 再重复一下,其他 Groovy 对 java.io.File 的扩展方法请参考 https://docs.groovy-lang.org/latest/html/groovy-jdk/java/io/File.html。如 eachDir()、eachDirMatch()、eachDirRecurse()、eachFileMatch()、filterLine()、newInputStream()、newOutputStream()、newReader()、newPrintWriter()、withInputStream()、withOutputStream()、withReader()、withPrintWriter() 等等。还要留意一下有一些方法是可以指定字符集的。

参考:1. 《Java 脚本编程语言、框架与模式》第 4 章

 

更新链接:2020-09-10


由于 http://groovy.codehaus.org 不再使用,所以更新原文中的两个链接

  • http://groovy.codehaus.org/groovy-jdk/java/io/File.html 更新为 https://docs.groovy-lang.org/latest/html/groovy-jdk/java/io/File.html
  • http://groovy.codehaus.org/groovy-jdk/ 更新为 https://groovy-lang.org/gdk.html

本文链接 https://yanbin.blog/unmi-study-groovy-file/, 来自 隔叶黄莺 Yanbin Blog

[版权声明] Creative Commons License 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。

Subscribe
Notify of
guest

5 Comments
Inline Feedbacks
View all comments
Johnny
16 years ago

splitEachLine是不是少了一个参数?

隔叶黄莺
16 years ago

是的,少了 (",") 以逗号分隔的参数,谢谢提醒,已改过来了。

wuweihi
wuweihi
16 years ago

以脚本语言的方式来写java代码,并且能实现同样强大的功能

真是让人舒服!

期待博主的文章!!!

伊士其
伊士其
15 years ago

splitEachLine的例子好像有问题吧,使用it的话,已经拆分到每个字了,而不是按行迭代了

隔叶黄莺
15 years ago

@伊士其

那个 splitEachLine 确实有问题,应该是不需要再进一步分隔了,正确的代码应该是:

lineList = new File("foo.csv").splitEachLine(",") {

//it.each {

println "name=${it[0]} balance=${it[1]}";

//}

}