groovy学习
最近项目用到了groovy,其实groovy底层就是java,能够编译为字节码,大部分情况能够用较少的代码完成java的功能,动态解释性的脚本语言,语法更加灵活,如果不先看看groovy的入门文章,会觉得挺怪,有多种语言结合的感觉在里面,一时还难以适应。下面的文章供参考:
1、精通 Groovy-使用 Groovy 的简单语法开发 Java 应用程序
http://www.ibm.com/developerworks/cn/education/java/j-groovy/index.html
2、each遍历详解
http://www.ibm.com/developerworks/cn/java/j-pg04149.html
3、文件操作
4、xml解析详解
http://www.ibm.com/developerworks/cn/java/j-pg05199/index.html
-------------------------------------
1、文件的操作:对java原有的io进行了扩展,增加了许多闭包后省去了很多逻辑无关代码,同时自动进行资源管理和异常处理。
2、each非常好用,不仅操作集合、映射,还能操作文件、数据库结果集等等。
//遍历文件夹下所有文件,是不是比java好用很多
def dir = new File("f:\\mtv")
fileNum=0
dirNum=0
dir.eachFileRecurse{
file->
if(file.isFile()){
fileNum++
println "FILE: ${file}"
}else if(file.isDirectory()){
dirNum++
println "DIR: ${file}"
}
}
println "fileNum="+fileNum
println "dirNum="+dirNum//HTTP请求
def url = new URL("http://www.taobao.com")
def file = new File("d:\\aa.htm");
url.eachLine{line->
file.append(line)
}
or
"http://www.taobao.com".toURL().eachLine{println it)}
-----------------------------------------------------
文件需要换行的话,需要增加换行符
def sepLine = System.getProperty('line.separator')
file << "$userId$sepLine"//解析xml
def users = new XmlSlurper().parse("d:\\aa.xml")
users.user.each{ user ->
println "${user.name},${user.age}"
}
//aa.xml
<users>
<user>
<name>Java</name>
<age>22</age>
</user>
<user>
<name>Groovy</name>
<age>23</age>
</user>
<user>
<name>Python</name>
<age>24</age>
</user>
</users>import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
// 利用java 类查找jar包中的文件
def findJarFile(File zipFile, String target){
ZipFile zip = new ZipFile(zipFile)
ZipEntry entry = null
Enumeration<? extends ZipEntry> en = zip.entries()
while (en.hasMoreElements()) {
entry = en.nextElement()
if (entry.isDirectory()) {
continue
}
if(entry.name.contains(target)){
println zipFile.name
println entry
}
}
zip.close()
}
String target = 'LocalStrings.properties'
new File('E:\\apache-tomcat-6.0.14\\lib').eachFile{
if(it.name.endsWith('.jar'))
findJarFile(it, target)
}3、xml文件解析、创建等
//类似python的字符串声明,不需要java中的转义
def xml = """
<langs type="current">
<language>Java</language>
<language>Groovy</language>
<language>JavaScript</language>
</langs>
"""
def langs = new XmlParser().parseText(xml)//parse("languages.xml"),文件解析
println "type = ${langs.attribute("type")}"
langs.language.each{
println it.text()
}//生成xml数据的代码非常简洁,各种java的三方库只能望其项背
def xml = new groovy.xml.MarkupBuilder()
//def sw = new StringWriter()
//def xml = new groovy.xml.MarkupBuilder(sw) //xml字符串输出到StringWriter
xml.langs(type:"current"){
language(loc:"default","java")
language("Groovy")
language("JavaScript")
}
//output
<langs type='current'>
<language loc='default'>java</language>
<language>Groovy</language>
<language>JavaScript</language>
</langs>Groovy 能够实现这种 Builder 魔法,因为它是一种动态的语言。另一方面,Java 语言则是静态的:Java 编译器将确保所有方法在您调用它们之前都是确实存在的。(如果您尝试调用不存在的方法,Java 代码甚至不进行编译,更不用说运行了。)但是,Groovy 的 Builder 证明,某种语言中的 bug 正是另一种语言的特性。如果您查阅 API 文档中的 MarkupBuilder 相关部分,您会发现它没有 langs() 方法、language() 方法或任何其他元素名称。幸运的是,Groovy 可以捕获这些不存在的方法调用,并采取一些有效的操作。
xml2种解析方式区别,XmlSlurper就像直接操作xml一样方便
def xml = """
<langs type='current' count='3' mainstream='true'>
<language flavor='static' version='1.5'>Java</language>
<language flavor='dynamic' version='1.6.0'>Groovy</language>
<language flavor='dynamic' version='1.9'>JavaScript</language>
</langs>
"""
def langs = new XmlParser().parseText(xml)
println langs.attribute("count")
langs.language.each{
println it.text()
}
langs = new XmlSlurper().parseText(xml)
println langs.@count
langs.language.each{
println it
}