1、object对象

1.1、查看object对象的信息

  • /*** @author liangchen* @date 2020/11/22*/
    // 使用 dump 和inspect 方法def newline = "\n"
    assert newline.toString() == "\n"// dump 对象信息
    assert newline.dump()=="<java.lang.String@a value=\n hash=10>"// 值
    assert newline.inspect() == /'\n'/class MyClass{def first = 1def getSecond(){first * 2}public third = 3def myMethod(){}
    }def obj = new MyClass()
    //判断是否存在某个属性
    assert  obj.hasProperty('first')
    // 判断是否存在某个方法
    assert obj.respondsTo('myMethod')// 属性的key
    def keys = ['first', 'second', 'class']
    assert obj.properties.keySet() == new HashSet<>(keys)// 属性map获取属性
    assert  1 == obj.properties['first']
    assert 1 == obj.properties.first// 调用getAt('first')
    assert 1 == obj.first
    assert 1 == obj['first']def one = 'first'
    def two = 'second'
    obj[one] = obj[two]
    // 查找存在first=2字符串
    assert obj.dump() =~'first=2'
    

1.2、Object方便使用的方法

  • 基础用法

    • package com.jack.groovy.ch12import com.jack.groovy.ch7.Address/*** @author liangchen* @date 2020/11/22*/
      // 在java中,判断相等
      int a = 1;
      int b =1;
      assert  a == b
      // 在groovy中
      assert a.is(b)// switch 也不限于Integer char 类型
      switch (new Date(0)) {case new Date(0): println 'dates are equal'}new Date().identity {println "$date.$month.$year"
      }//赋值
      def address = new Address()
      address.with {state = '中国'street = '天顶乡'}// 格式化打印
      printf('PI=%2.5f and E = %2.5f', Math.PI, Math.E)//直接use类的静态方法
      class StringCasingCategory{static String lower(String string) {return string.toLowerCase()}
      }use(StringCasingCategory){assert "groovy" == "GROOvy".lower()
      }// sleep 打印
      text = "间断打印"
      for (c in text) {sleep(100)print c
      }
      

1.3、遍历迭代


2、文件和I/O

/*** @author liangchen* @date 2020/11/22*/
file = new File('_12_1_1InteractiveObject.groovy')file.each {println it}
assert  file.any{ it=~ /方法/}assert 2 == file.findAll { it =~ /方法/ }.size()assert 38== file.grep{it}.size()

2.1、遍历文件系统

  • package com.jack.groovy.ch12import groovy.io.FileType/*** @author liangchen* @date 2020/11/22*/
    file = new File('.')
    // 打印文件名
    println file.name// 绝对路径
    println file.absolutePath// 规范路径
    println file.canonicalPath// 是否为目录
    println file.directory// File 遍历系统def topDir = new File('../../../../')
    def srcDir = new File(topDir,'')
    dirs = []
    srcDir.eachDir { dirs << it.name }
    assert ['com'] == dirsdirs=[]
    // 递归遍历文件夹
    topDir.eachDirRecurse {dirs << it.name}
    assert dirs.containsAll(['jack','groovy', 'ch2'])dirs = []
    // 匹配第一个
    topDir.eachDirMatch(~/[^1]*/) { dirs << it.name }
    assert dirs == ['com']// 遍历文件和目录
    files=[]
    topDir.eachFile { files << it.name }
    assert  files.contains('com')
    assert files.contains('.DS_Store')files = []
    topDir.eachFile ( FileType.FILES){files << it.name}
    assert  files.contains('.DS_Store')// 计数目录
    count = 0
    srcDir.eachFileRecurse {if(it.directory) count++}count =0
    srcDir.eachFileRecurse (FileType.DIRECTORIES) {count++}
    assert 19 == count
    topDir.eachFileMatch(~/_12_2_1.*/) { files << it.name }
    assert ['.DS_Store'] == files
    

2.2、读取输入

/*** @author liangchen* @date 2020/11/22*/
example = new File("data/example.txt")lines = ['line one', 'line two', 'line three']
assert  lines == example.readLines()example.eachLine {assert it.startsWith('line')
}hex = []
example.eachByte {hex << it}
assert  hex.size() == example.length()example.splitEachLine(/\s/){assert 'line' == it[0]
}example.withReader {reader->assert  'line one' == reader.readLine()
}

2.3、写出文件

  • reader 做writer

    • /*** 写出文件* @author liangchen* @date 2020/11/22*/def outFile = new File('data/example.txt')
      def lines = ['line one', 'line two', 'line three']
      outFile.write(lines[0..1].join("\n"))
      outFile.append("\n" + lines[2])
      assert lines == outFile.readLines()
      outFile.withWriter {writer ->writer.writeLine(lines[0])
      }outFile.withWriterAppend ('ISO8859-1') {writer -> writer << lines[1] << "\n"}
      outFile << lines[2]TimeZone.default = TimeZone.getTimeZone("CET")
      reader = new StringReader('abc')
      writer = new StringWriter()writer << "\nsome String" << "\n"
      writer << [a: 1, b: 2] << "\n"
      writer << [3, 4] << "\n"
      writer << new Date(0) << "\n"
      // ready可直接做writer入参
      writer << reader << "\n"println writer.toString()

2.4、过滤和转换

  • new Reader / new InputStream / new DataInputStream / newDataOutputStream/new ObjectOutputStream/ new OutputStream/new Writer 获取资源

  • package com.jack.groovy.ch12/*** 过滤行数* @author liangchen* @date 2020/11/23*/
    def n = System.lineSeparator()
    reader = new StringReader("abc")
    writer = new StringWriter()
    //当前元素的下一个元素
    reader.transformChar(writer){it.next()}
    assert  'bcd' == writer.toString()// 去掉 line字段
    reader = new File("data/example.txt").newReader()
    writer = new StringWriter()
    reader.transformLine(writer) { it - 'line' }
    assert " one${n} two${n} three${n}" == writer.toString()input = new File('data/example.txt')
    writer = new StringWriter()// 匹配有one字符串的行
    input.filterLine(writer) { it =~ /one/ }
    assert "line one${n}" == writer.toString()// 过滤长度大于8 的行数
    writer = new StringWriter()
    writer << input.filterLine {it.size() > 8}
    assert "line three${n}" == writer.toString()// base 64
    byte[] data = new byte[256]
    for(i in 0..255) {data[i] == i}
    store = data.encodeBase64().toString()
    // 以什么开头
    assert store.startsWith('AAECAWQFBg')
    // 以。。结尾
    assert store.endsWith  ('r7/P3+/w==')
    //解码base64
    restored = store.decodeBase64()
    assert data.toList() == restored.toList()
    
    • 注意需要了解base64 参考RFC 2045

2.5、Streaming serialized objects(流序列化对象)

  • /*** @author liangchen* @date 2020/11/24*/
    // 序列化
    file = new File('objects.dat')
    // 在jvm退出时候删除文件
    file.deleteOnExit()objects = [1,'Hello Groovy!', new Date()]
    // 写入对象到文件中
    file.withObjectOutputStream { outstream ->objects.each{outstream << it}
    }// 从文件中读取对象到retrieved中
    retrieved = []
    file.withObjectInputStream {instream ->instream.eachObject {retrieved << it}
    }assert  retrieved == objects
    

2.6 临时数据和文件复制

  • // 12.11 在临时目录的复制// 创建一个临时目录
    File tempDir = File.createTempDir()
    assert  tempDir.directorySize() == 0// 创建一个临时文件input.data,
    File source = new File(tempDir, 'input.dat')
    source.bytes = "hello world".bytes
    // 这个目录下所有文件大小之和
    assert tempDir.directorySize() == 11//创建一个新的文件,output.dat, 把input.dat的内容输出到output.dat中
    File destination = new File(tempDir, 'output.dat')
    destination.withDataOutputStream { os ->source.withDataInputStream {is ->os << is}
    }
    // 最后文件大小是 11*2 = 22
    assert  tempDir.directorySize() == 22
    // 删除临时文件夹
    tempDir.deleteDir()
    

3、线程和处理

3.1、groovy多线程

  • package com.jack.groovy.ch12import java.util.concurrent.BlockingQueue
    import java.util.concurrent.LinkedBlockingQueue/*** @author liangchen* @date 2020/11/24*/
    // Groovy 多线程//创建线程的方式
    // 方式1
    t = new Thread(){// 具体运行内容
    }
    t.start()// 方式2
    Thread.start {//具体运行内容
    }
    Thread.start("线程名称"){}
    // 创建守护线程
    Thread.startDaemon {//具体运行内容
    }
    Thread.startDaemon ("线程名称"){// 具体运行内容
    }
    // 线程延迟1秒后运行
    current = System.currentTimeMillis()
    println "当前时间:$current"
    new Timer().runAfter(1000){delta = System.currentTimeMillis() - currentprintln "耗时:$delta"
    }// 12.12 使用线程来解决生产者和消费者
    //在Thread中定义个静态的getName方法
    Thread.metaClass.'static'.getName = {Thread.currentThread().name}
    BlockingQueue sharedQueue = [] as LinkedBlockingQueue// 创建生产者线程
    Thread.start('push'){// 遍历10次10.times {try {println("${Thread.name}\t: ${it}")// 数字加到sharedQueue当中sharedQueue << itsleep(100)} catch (InterruptedException ignore) {}}
    }
    // 创建消费者线程
    Thread.start('pop') {for (i in 0..9) {sleep 200println("队列元素:$sharedQueue")println ("${Thread.name}\t : ${sharedQueue.take()}")}
    }

3.2、整合外部过程(执行命令行)

  • package com.jack.groovy.ch12/*** @author liangchen* @date 2020/11/24*/
    //
    // 用groovy执行命令行的命令, 创建一个process, 也就是可以创建一个执行过程
    def listFiles = 'ls'.execute()
    // 这里创建一个文件夹aa
    'mkdir aa'.execute()
    def ignoreCase = "tr '[A-Z]' '[a-z]'".execute()
    def reverseSort = 'sort -r'.execute()
    println listFiles
    listFiles | ignoreCase| reverseSortreverseSort.waitForOrKill(1000)
    if (reverseSort.exitValue()) {println reverseSort.err.text
    }each {println reverseSort.text
    }// 发现list
    def outputBuffer = new StringBuffer()
    def errorBuffer = new StringBuffer()zipProcess = 'gzip -c'.execute()
    unzipProcess = 'gunzip -c'.execute()unzipProcess.consumeProcessOutput(outputBuffer,errorBuffer)
    zipProcess.consumeProcessErrorStream(errorBuffer)
    zipProcess | unzipProcess
    zipProcess.withWriter { writer->writer << 'Hello World'
    }
    unzipProcess.waitForOrKill(1000)
    println 'outPut:' + outputBuffer
    println 'Error:' + errorBuffer
    

4、 模板

4.1、理解模板格式

  • 模板格式

4.2、模板实战

  • ${} 对应不是迭代的, <% %> 迭代情况拼接字符串

  • package com.jack.groovy.ch12import groovy.text.SimpleTemplateEngine/*** @author liangchen* @date 2020/11/24*/
    //注意是三单引号  ${} 对应不是迭代的, <% %> 迭代情况拼接字符串
    mailReminder =
    '''
    Dear ${salutation?salutation+' ':''}$lastname,another month has passed and it's time for these
    <%=tasks.size()%> tasks:<% tasks.each{%>- $it<%} %>
    your collaboration is very much appreciated
    '''// 创建模板引擎,
    def engine = new SimpleTemplateEngine()
    // 创建模板
    def template = engine.createTemplate(mailReminder)
    // 创建绑定数据
    def binding = [salutation:'Mrs.',lastname:'Davis',tasks :['visit the Groovy in Action (GinA) page', 'chat with GinA readers']
    ]
    // 进行绑定
    println template.make(binding).toString()
    

4.3、高级template特性

  • 需要使用单引号,因为双引号GString在编译时候自动替换值,而模板是需要在调用绑定方法时候才替换,所有双引号会报方法找不到异常
  • StreamingTemplateEngine :处理template比较大,一般大于64000个字符
  • GStringTemplateEngine: 在写闭包中提供更好性能和扩展能力
  • XmlTemplateEngine 处理xml文件
  • MarkupTemplateEngine: 推荐使用,编译模板有更好的性能,检查在模板中使用的属性

5、Groovlets

  • 暂时不涉及

6、总结

  1. GDK 加强JDK的能力
  2. GDK使得处理I/O更加简单,自动处理资源的释放
  3. GDK使用线程也是比较简单

第十二章、GDK学习相关推荐

  1. 【鸟哥的Linux私房菜】第十二章、学习shell脚本

    第十二章.学习shell脚本 以下皆为实践题,请自行编写出程序 请建立一个脚本,当你执行该脚本的时候,该脚本可以显示:(1)你目前的身份(用 whoami) (2)你目前所在的目录(用pwd) #!/ ...

  2. Python在机器学习中的应用--第十二章深度学习

    第十二章深度学习 import numpy as np import matplotlib.pyplot as plt from matplotlib.font_manager import Font ...

  3. July博客第十二章参考学习

    ### July博客第十二章参考学习 ## 第一题:给40亿个不重复的unsigned int 的整数,无序,给一个随机数,快速判断这个是否在40亿个数当中 1. 个人思路: - bitmap,重点在 ...

  4. HTML学习第十二章------布局和排版

    HTML学习第十二章------布局和排版 教材:Head First HTML与CSS 布局 浏览器用流(flow)来布置页面上的XHTML元素, 即跟着元素的流(顺序)来进行显示. 块元素是从头流 ...

  5. 在Jetson Nano上学习ROS的记录(版本Ubuntu18.04,课程来源赵虚左老师的《ROS理论与实践》)第十二章 机器人导航(仿真)

    系列文章目录 第一章 ROS空间创建.helloworld的实现.开启多个节点 第二章 话题通信 第三章 服务通信 第四章 参数服务器 第五章 常用指令 第六章 通信机制实操 第七章 ROS通信机制进 ...

  6. 工程伦理第十二章学习笔记2020最新

    工程伦理第十二章学习笔记2020最新 继续更新

  7. css层叠样式表基础学习笔记--第十二章 我要自学网首页实战

    第十二章 我要自学网首页实战 12-01 页面分析 12-02 工作准备 12-03 搜索区块页面结构 12-04 导航条布局 12-05 幻灯片布局 12-06 公告栏布局 12-07 远程培训班布 ...

  8. linux脚本求命令行上整数和,《Linux命令行与shell脚本编程大全》 第二十二章 学习札记...

    <Linux命令行与shell脚本编程大全> 第二十二章 学习笔记 第二十二章:使用其他shell 什么是dash shell Debian的dash shell是ash shell的直系 ...

  9. 【Linux命令】《鸟哥Linux基础》第十二章 学习shell脚本

    第十二章 学习shell脚本 通常利用shell脚本完成服务器的检测工作,不涉及大量运算. 12.1 简单shell脚本介绍 12.2 简单shell脚本练习 12.2.1 简单范例 范例1:永远的开 ...

  10. Js高级程序设计第三版学习(十二章)

                                  Js高级程序设计第三版学习(十二章) 第十二章 DOM2和DOM3   1.样式: 访问样式属性 任何支持style特性的HTML元素都有一 ...

最新文章

  1. 推荐算法-聚类-K-MEANS
  2. 【bzoj 2435】[Noi2011]道路修建(dfs)
  3. Exchange端口列表
  4. 7.11牛客题(指针)
  5. 腾讯公开“区块链网络的信息处理方法”相关专利
  6. Azure powershell 获取 vmSize 可用列表的命令
  7. python自动化办公入门书籍-Python如此神奇,让繁琐工作自动化 (文中含Python基础)...
  8. Linux下实现Rsync目录同步备份
  9. dnf服务器地址修改,修改dnf单机服务器地址
  10. 信息学奥赛一本通网站
  11. java class文件反编译
  12. MAC IDEA启动后卡住不动
  13. R语言:批量获取指定股票代码的股票数据
  14. 深度学习 01 探索深度学习
  15. 数据结构(C语言)——线性表(定义,基本操作)
  16. Unity创建Animation动画无法播放问题
  17. foo()和@foo()的区别是什么?
  18. 微信小程序-JAVA实现微信支付功能(微信支付2.0)
  19. VHDL中的signal(信号)variable(变量)的定义与赋值
  20. 计算机应用当兵分配到哪,小编告诉你参军后的去向是如何确定的

热门文章

  1. 【个人记录|环境配置等】
  2. 大学生如何培育计算机思维,计算机思维下的计算机课程改革思路探索
  3. 关于ArcMap中道路、河道中心线提取过程
  4. 桌面PDF文件名太长无法删除的问题
  5. 免费PBootCMS采集支持聚合文章采集插件
  6. 中了exe病毒文件夹变exe应用程序解决办法
  7. 找不到移动硬盘解决办法
  8. php屏蔽微信网页投诉按钮,屏蔽微信(QQ)内置浏览器菜单中的投诉按钮
  9. linux中如何修改只读文件
  10. PowerBI开发 第三篇:报表设计技巧