栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Groovy之高级用法

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Groovy之高级用法

1、JSON的序列化与反序列化 1.1、将数据转为JSON 

Groovy中提供了JsonOutput这个类,调用里面的方法,可以帮我们将数据转为JSON

def list = [new Person(name: 'John', age: 25),
            new Person(name: 'Jack', age: 18)]
// println JsonOutput.toJson(list) // 将列表转为json
def json = JsonOutput.toJson(list)
println JsonOutput.prettyPrint(json) // 带格式的JSON输出方式
1.2、将JSON转为原始数据

Groovy中提供了JsonSlurper,调用里面的方法可以进行JSON的反序列化

def jsonSlurper = new JsonSlurper()
println jsonSlurper.parseText(json)

注意:如果我们不想使用Groovy中自带的JSON转换工具,也可以通过导入jar包方式,使用其他的JSON转换工具,Groovy完全支持Java中的JSON序列化工具。

2、xml文件的解析和创建 2.1、 解析xml

解析xml文件需要使用Groovy中的XmlSlurper工具类,它极大地简化了Java中xml读取方法。

final String xml = '''
    
        
            
                
                    疯狂Android讲义
                    李刚
                
                
                   第一行代码
                   郭林
               
               
                   Android开发艺术探索
                   任玉刚
               
               
                   Android源码设计模式
                   何红辉
               
           
           
               
                   Vue从入门到精通
                   李刚
               
           
       
    
'''

// 解析xml
def xmlSluper = new XmlSlurper()
def response = xmlSluper.parseText(xml)

println response.value.books[0].book[0].title.text() // 疯狂Android讲义
println response.value.books[1].book[0].@available // 10
2.2、xml文件的遍历

案例:查找所有书籍作者为李刚的书

普通方式

def list = []
response.value.books.each { books ->
    // 下面对书节点进行遍历
    books.book.each { book ->
        def author = book.author.text()
        if (author.equals("李刚")) {
            list.add(book.title.text())
        }
    }
}

Groovy中的深度递归遍历方式

// groovy中为我们提供了递归深度遍历方法,极大地简化了代码
def titles = response.depthFirst().findAll { book -> // depthFirst()还可以使用"**"代替
    return book.author.text() == '李刚' ? true : false
}

Groovy中的广度递归遍历方式

// 广度遍历xml
def name = response.value.books.children().findAll { node ->  // children方法可以用操作符'*'代替, def name = response.value.books.'*'.findAll
    node.name() == 'book' && node.@id == '2' // 查找节点名称为book且id=2的书籍
}.collect { node ->
    return node.title.text()
}
2.3、xml文件的创建

借助于Groovy中的MarkupBuilder核心类,调用里面的方法,进行xml格式数据的生成

def sw = new StringWriter();
def xmlBuilder = new MarkupBuilder(sw) // 用来生成xml数据的核心类
// 创建根节点langs
xmlBuilder.langs(type: 'current', count: '3', mainstream: 'true') {
    // 创建子节点language
    language(flavor: 'static',version:'1.5','Java') // 不指定属性名,就代表节点的值
    language(flavor: 'dynamic',version:'1.6.0','Groovy')
    language(flavor: 'dynamic',version:'1.9','JavaScript')
}
println sw

动态生成xml数据

def sw = new StringWriter();
def xmlBuilder = new MarkupBuilder(sw) // 用来生成xml数据的核心类
def langs = new Langs()
xmlBuilder.langs(type: langs.type, count: langs.count,
        mainstream: langs.mainstream) {
    //遍历所有的子结点
    langs.languages.each { lang ->
        language(flavor: lang.flavor,
                version: lang.version, lang.value)
    }
}
println sw

//对应xml中的langs结点
class Langs {
    String type = 'current'
    int count = 3
    boolean mainstream = true
    def languages = [
            new Language(flavor: 'static',
                    version: '1.5', value: 'Java'),
            new Language(flavor: 'dynamic',
                    version: '1.3', value: 'Groovy'),
            new Language(flavor: 'dynamic',
                    version: '1.6', value: 'JavaScript')
    ]
}
//对应xml中的languang结点
class Language {
    String flavor
    String version
    String value
}

3、文件操作  3.1、读取文件

方法一:使用eachLine方法遍历读取文件

def file = new File('xmlStudy.groovy')
file.eachLine {line ->
     println line
 }

方式二:使用getText方法获取文件全部内容

def text = file.getText()  // 获取文件内容
println text

方式三:使用readLines方法把读取到的文件放入list列表中

def result = file.readLines() 

方式四:借助withReader方法读取文件部分内容

def file = new File('test.txt')
def reader = file.withReader { reader ->
    char[] buffer = new char[100]
    reader.read(buffer)
    return buffer
}
3.2、文件的写入

对文件进行写入使用withWriter方法

def file = new File('test.txt')
def writer = file.withWriter { write ->
    def Test = "我爱Java"
    def buffer = Test.getBytes()
    write.write(buffer)
    return buffer
}
3.3、文件拷贝(读写相结合)
def copy(String sourcePath, String destationPath) {
    try {
        // 首先创建目标文件
        def desFile = new File(destationPath)
        if (!desFile.exists()) {
            desFile.createNewFile()
        }

        // 开始copy
        new File(sourcePath).withReader { reader ->
            def lines = reader.readLines()
            desFile.withWriter() { writer ->
                lines.each { line ->
                    writer.append(line + "rn")
                }
            }
        }
        return true
    } catch (Exception e) {
        e.printStackTrace()
    }
    return false
}
// Groovy中调用它的文件操作方法,不需要关闭流,因为它的这个方法中已经设置了流的关闭操作。

4、对象的写入与读取、 4.1、将对象写入到文件

借助于withObjectOutputStream方法,我们可以将对象写入到文件中去

def saveObject(Object object, String path) {
    try {
        // 首先创建目标文件
        def desFile = new File(path)
        if (!desFile.exists()) {
            desFile.createNewFile()
        }
        desFile.withObjectOutputStream { out ->
            out.writeObject(object) // 将对象写入文件
        }
        return true
    } catch (Exception e) {
    }
    return false
}
4.2、从文件中读取对象

借助于withObjectInputStream方法,我们可以将对象从文件中读取出来

def readObject(String path) {
    def obj = null
    try {
        def file = new File(path)
        if (file == null || !file.exists()) return null
        // 从文件中读取对象
        file.withObjectInputStream { input ->
            obj = input.readObject()
        }
    } catch (Exception e) {

    }
    return obj
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/992643.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号