Scala学习九——文件和正则表达式
一.本章要点
- Source.fromFile(...).getLines.toArray输出文件的所有行;
- Source.fromFile(...).mkString以字符串形式输出文件内容;
- 将字符串转换为数字,可以用toInt或toDouble方法;
- 使用Java的PrintWriter来写入文件;
- ”正则“.r是一个Regex对象;
- 如果你的正则表达式包含反斜杠或引号的话,用”“”...“”“;
- 如果正则模式包含分组,你可以用如下语法提取内容:for(regex(变量1,...,变量n)<-字符串)
二.读取行
注:用完Source对象后,记得close
import scala.io.Source
//第一个参数可以是字符串或者java.io.File
//如果你知道文件使用的是当前平台缺省的代码,可以省略第二个参数
val source=Source.fromFile("myFile.txt","UTF-8")
//返回的是一个迭代器
val lineIterator=source.getLines
//可以逐行获取
for(l<-lineIteraor) ...
//可以放到数组(toarray)或数组缓冲(toBuffer)
val lines=source.getLines.toArray
//读取成一个字符串
val contents=source.mkString
三.读取字符
1.直接把Source对象当作迭代器(Source类扩展于Iterator[Char],例:for(c<-Source)...),想要查看某个字符又不处理它(调用source对象的buffered方法,用head方法查看下一个字符又不处理,相当于Java的PushbackInoutStreamReader);
2.文件不大,可以直接读取到一个字符串中
四.读取词法单元和数字
快而脏读取词法单元,以空格隔开:val tokens=source.mkString.split("\\S+")
读取到数组val numbers=for(w<-token) yield w.toDouble或者val numbers=tokens.map(_.toDouble)
五.从URL或其他源读取
//从URL读取时需要事先知道字符集
val sources1=Source.fromURL("http://horstman.com","UTF-8")
//从给定的字符串读取,对调试很有用
val source2=Source.fromString("Hello,World")
//从标准输入读取数
val source3=Source.stdin
六.读取二进制文件
Scala没有提供,需要使用Java类库
val file=new File(filename)
val in=new FileInoutStream(file)
val byte=new Array[Byte](file.length.toInt)
in.read(bytes)
in.close()
七.写入文本文件
Scala没有内建的对写入文件的支持,需要用java.io.PrintWrite
val out=new PrintWriter("numbers.txt")
for(i<- 1 to 100)
//如果是使用printf会提示把它转换为AnyRef
out.println(i)
out.close()
八.访问目录
Scala也没有提供正式的访问目录中的所有文件的方法:
import java.io.File
def subdirs(dir:File):Iterator[File]={
val children=dir.listFiles.filter(_.isDirectory)
children.toIterator++children.toIterator.flatMap(subdirs _) } for(d<-subdirs(dir))...
Java7中还有walkFileTree方法可行
九.序列化
利用序列化将对象传输到其他虚拟机或临时存储。
val fred = new Person(...)
import java.io._
val out=new ObjectOutputSteam(new FileOutputStream("...."))
out.writeObject(fred)
out.close()
val in=new ObjectInputStream(new FileInputStream("..."))
val savedFred=in.readObject().asInstanceof(Person)
//Scala集合类是可序列化的 class Person extends Serializable{
private val friends=new ArrayBuffer[Person] }
十.进程控制
scala.sys.process提供了与shell交互的工具,scala.sys包含了一个从字符串到ProcessBuilder对象的隐式转换(!执行的就是这个,成功执行程序返回0,否则非0;!!以字符串形式返回;#>输出重定向;#>>追加;#<把某个文件内容作为输入;管道符#|......#||;#&&等等)
可以使用Process对象的apply方法构造ProcessBuilder,然后执行。
十一.正则表达式
使用scala.util.matching.Regex使用正则表达式分析,使用String类的r方法构建Regex对象。
如果正则表达式包含反斜杠或引号,最好使用"""...""",例:val wsnumsPattern="""\s+[0,9]\s+""".r,比"\\s+[0,9]+\\s+"更易读。
findAllIn方法返回遍历所有匹配项的迭代器(可以用for遍历),也可以将迭代器转成数组.......还有findFirstIn(首个匹配项,得到Option),findPrefixOf(检查是否某个字符串的开始部分能匹配),replaceFirstIN(替换首个),replaceAllIn(替换所有)。
十二.正则表达式组
分组让我们更方便的获取正则表达式的子表达式,想要获取的子表达式加()即可,如:val numPattern="([0-9]+)([a-z]+)".r,还可以当做提取器val numPattern(num,item)="...."。
十三.练习
最新文章
- linux 命令行中常用光标移动快捷键
- GitLab常见使用方法
- 初识Groovy
- 面向初学者的 Windows 10 UWP 应用开发
- C++ __int64用法(转)
- Jdk命令之jps
- STL容器的本质
- 解决oracle数据库连接不上的问题
- Android多线程下安全访问数据库
- [Java] JDK 环境配置(图文)
- 003.Ceph扩展集群
- phpcms首页替换
- java常用类-StringBuffer,Integer,Character
- 比较好的MySQL索引原理
- 长距离单历元非差GNSS网络RTK理论与方法总结(未完)
- JQuery的源码阅读
- PLSQL Developer工具的使用
- day 28 :进程相关,进程池,锁,队列,生产者消费者模式
- 百度地图api-动态添加覆盖物
- Tiny 6410的Linux学习总结!