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 }