这篇博客记录一下Groovy处理文件时涉及的基本操作。
整体来说,Groovy的I/O操作是建立在Java的I/O操作之上的,
不过进行了更为简单的封装,并且利用Closure来简化代码的编写。
1 读文件
Groovy读取文件时,与Java一致,首先需要创建文件对应的对象,
对应的操作类似于:
def targetFile = new File("/home/zhangjian/Desktop/file.txt")
1.1 读取文件的每一行
创建出文件对应的对象后,可以直接利用eachLine接口读取文件的每一行。
eachLine接口的参数为一个Closure,类似的用法类似于:
targetFile.eachLine { String oneLine ->
println oneLine
}
1.2 得到文件的全部内容
如果需要直接得到文件中的全部内容,可以利用文件对象的getBytes接口:
//该接口返回的是文件内容对应的byte[]
def bytes = targetFile.getBytes()
//与上述接口对应,还可以直接使用targetFile.bytes这个属性获取文件内容
1.3 获取文件对应的inputStream
与Java一样,Groovy中的文件也可以利用inputStream来进行操作,
对应的操作类似于:
//实际上获取的是Java中的BufferedInputStream
def ism = targetFile.newInputStream()
//利用inputStream的接口进行相关操作
println ism.readLines()
//使用完毕后同样需要关闭
ism.close()
当然,Groovy中的file对象有一个withInputStream接口,可以接受一个Closure对象作为参数。
在接口中可以仅关注inputStream的相关的操作,不用负责关闭inputStream。
类似的操作类似于:
targetFile.withInputStream { ism ->
println ism.readLines()
}
2 写文件
与读文件类似,Groovy同样可以利用Java中outputStream来进行写文件相关的操作。
类似的操作如下:
//这里获取的实际是Java中的BufferedOutputStream
def osm = targetFile.newOutputStream()
osm.write("just a test".getBytes())
osm.close()
同样,file对象同样有一个withOutputStream接口,可以简化outputStream相关的操作:
targetFile.withOutputStream { osm ->
osm.write("just a new test".getBytes())
}
最后,Groovy中的outputStream重载了<<操作符,
可以比较方便地完成文件的复制,对应的操作类似于:
def srcFile = new File("/home/zhangjian/Desktop/file.txt")
def dstFile = new File("/home/zhangjian/Desktop/dst.txt")
dstFile.withOutputStream { osm ->
srcFile.withInputStream { ism ->
//直接将inputStream中读取到的内容写入到outputStream
osm << ism
}
}
3 XML操作
Groovy中解析XML文件的操作比较直观,主要用到了GPathResult对象。
我们通过一个例子,很容易明白它的用法。
我们以Android中应用stk为例,看看Groovy如何解析其对应的AndroidManifest.xml。
xml文件的内容如下:
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2007 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE