groovy学习

PeterHao0 2013-08-31

最近项目用到了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
}

  

相关推荐