本篇主要讲的是在Gradle中对Json、XML 文件的解析处理和输出,以及文件的读和写操作,因为这些操作对于后面的 Android 高级开发是有帮助的,比如帮助统计版本信息等。
注意:在使用之前加上Gson的lib库,添加第三方jar gson-2.7.jar,在项目根目录创建libs目录 --> gson.jar -> 右键 add as Library。
package advance
import com.google.gson.Gson
import groovy.json.JsonOutput
import groovy.json.JsonSlurper
import oop.Person
//groovy json 操作
//groovy xml文件操作详解
//groovy 文件操作
//groovy与Java对比及总结
def list = [new Person(name: 'lily', age: 24),
new Person(name: 'John', age: 25)]
//Gson来创建json
//添加第三方jar gson-2.7.jar
//在项目根目录创建libs目录 --> gson.jar -> 右键 add as Library
def gson = new Gson()
//[{"name":"lily","age":24},{"name":"John","age":25}]
println gson.toJson(list)
def json = JsonOutput.toJson(list)
//[{"age":24,"name":"lily"},{"age":25,"name":"John"}]
println json
//更加漂亮的打印输出
//println JsonOutput.prettyPrint(json)
//解析成JSON对象
//def jsonSluper = new JsonSlurper()
//jsonSluper.parse()
//请求网络数据
def weatherUrl = 'https://www.mxnzp.com/api/weather/current/%E6%B7%B1%E5%9C%B3%E5%B8%82?app_id=jquvkfnwqfxmgnlp&app_secret=NzBtQ3ozM2hqWjFNN3FmTTZGK0h3UT09'
def response = getNetWorkData(weatherUrl)
//[code:1, msg:数据返回成功!, data:[address:广东省 深圳市, cityCode:440300, temp:27℃, weather:阴, windDirection:东北, windPower:≤3级, humidity:88%, reportTime:2021-06-25 09:30:08]]
println response.data.address
println response.data.temp
def getNetWorkData(String url){
//发送Http请求
def connection = new URL(url).openConnection()
connection.setRequestMethod('GET')
connection.connect()
def response = connection.content.text
//将json转化成实体对象
def jsonSluper = new JsonSlurper()
return jsonSluper.parseText(response)
}
1. xml文件解析
import groovy.xml.XmlSlurper
//xml文件解析
//java如何处理xml文件
//java xml处理 DOM文档驱动处理 2. 事件驱动处理
//groovy中如何解析一个xml格式数据
//groovy中如何创建一个xml数据文件
final String xml = '''
疯狂Android讲义
李刚
第一行代码
郭霖
Android开发艺术探索
任玉刚
Android设计模式
任玉刚
Vue的学习
李刚
'''
//开始解析xml 数据
def xmlSluper = new XmlSlurper()
def response = xmlSluper.parseText(xml)
//疯狂Android讲义
println response.value.books.book[0].title.text()
//取出book节点的available属性 属性的值是 20
println response.value.books[0].book[0].@available
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())
}
}
}
println list.toListString()
3. 深度遍历和广度遍历
//深度遍历
def titles = response.depthFirst().findAll { book->
return book.author.text() == '李刚'
}
//这是把整个对象都打印出来了
println titles.toListString() //[疯狂Android讲义李刚, Vue的学习李刚]
//广度遍历
def names = response.value.books.children().findAll { node->
return node.name() == 'book' && node.@id == '2'
}.collect {
node-> return node.title.text()
}
println names.toListString() //[第一行代码]
4. 创建xml格式字符串
//生成xml格式数据
def rawXml = '''
Java
Groovy
Script
'''
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'){
age('16')
}
language(flavor:'dynamic', version:'1.6.0'){
age('10')
}
language(flavor:'dynamic', version:'1.9', 'Script')
}
println sw
输出结果:
//打印输出
16
10
Script
5. 根据对象来创建xml格式数据
def sw = new StringWriter()
def xmlBuilder = new MarkupBuilder(sw)
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.6', value:'Java'),
new Language(flavor: 'dynamic', version: '1.5', value:'Groovy'),
new Language(flavor: 'dynamic', version: '1.3', value:'JavaScript'),
]
}
//对应xml中的language节点
class Language {
String flavor
String version
String value
}
输出结果:
//打印输出
Java
Groovy
JavaScript
所有Java对文件的操作,使用 groovy 都可以实现,而且 groovy 扩展了许多更加快捷和强大的方法。
遍历文件的每行内容
def file = new File('../../Groovy-02.iml')
//遍历文件的每行内容
file.eachLine {line ->
println line
}
一次性输出文件的所有内容
//完整的获取文本内容
def text = file.getText()
println text
获取文件内容的所有行内容
def result = file.readLines()
result.each {line->
println "$line"
}
读取指定个数的字符内容
//只读取100个字符,并放入buffer中,最后返回buffer
def reader = file.withReader {
reader ->
char[] buffer = new char[100]
reader.read(buffer)
return buffer
}
println reader
文件的读写拷贝
def result = copy('../../Groovy-02.iml', '../../Groovy-03.iml')
println result
//文件的读和写
def copy(String sourcePath, String destinationPath) {
try {
//1. 首先创建目标文件
def destFile = new File(destinationPath)
if (!destFile.exists()) {
//如果目标文件不存在,则创建目标文件
destFile.createNewFile()
}
//2. 开始拷贝
new File(sourcePath).withReader {
reader ->
//通过reader获取到所有的内容
def lines = reader.readLines()
destFile.withWriter {
writer ->
lines.each {
line -> writer.append(line + "\r\n")
}
}
}
return true
} catch (Exception e) {
e.printStackTrace()
}
return false
}
对象写入和读取
//将对象写入到文件,然后从文件中读取对象
//Person需要显示Serializable接口
def person = new Person(name: 'lisi', age: 28)
saveObject(person, '../../person.bin')
def personRead = (Person)readObject('../../person.bin')
println "the name is ${personRead.name}, the age is $personRead.age"
//对象读写
def saveObject(Object object, String path) {
try {
//1. 首先创建目标文件
def destFile = new File(path)
if (!destFile.exists()) {
destFile.createNewFile()
}
//针对不同的对象创建不同的输出流
destFile.withObjectOutputStream {out-> out.writeObject(object)}
return true
} catch (Exception e) {
e.printStackTrace()
}
return false
}
def readObject(String path){
def obj = null
try {
//1. 首先创建目标文件
def destFile = new File(path)
if (destFile== null ||!destFile.exists()) {
return null
}
//从文件中读取对象
destFile.withObjectInputStream {
input-> obj = input.readObject()
}
return obj
}catch(Exception e){
e.printStackTrace()
}
return null
}
//输出
the name is lisi, the age is 28