一.本章要点

  • 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)="...."。

十三.练习

  

Scala学习九——文件和正则表达式的更多相关文章

  1. Scala学习(九)---文件和正则表达式

    文件和正则表达式 摘要: 在本篇中,你将学习如何执行常用的文件处理任务,比如从文件中读取所有行或单词,或者读取包含数字的文件等.本篇的要点包括: 1. Source.fromFile(...).get ...

  2. Scala学习(九)练习

    文件正则表达式&练习 1. 编写一小段Scala代码,将某个文件中的行倒转顺序,将最后一行作为第一行,依此类推 程序代码: import scala.io.Source import java ...

  3. Scala学习笔记--文件IO

    补充: http://blog.csdn.net/lyrebing/article/details/20369445 http://developer.51cto.com/art/200907/134 ...

  4. 初步学习pg_control文件之九

    接前文,初步学习pg_control文件之八 来看这个: pg_time_t time; /* time stamp of last pg_control update */ 当初初始化的时候,是这样 ...

  5. 机器学习(三)--- scala学习笔记

    Scala是一门多范式的编程语言,一种类似Java的编程语言,设计初衷是实现可伸缩的语言.并集成面向对象编程和函数式编程的各种特性. Spark是UC Berkeley AMP lab所开源的类Had ...

  6. 【大数据】Scala学习笔记

    第 1 章 scala的概述1 1.1 学习sdala的原因 1 1.2 Scala语言诞生小故事 1 1.3 Scala 和 Java  以及 jvm 的关系分析图 2 1.4 Scala语言的特点 ...

  7. 【Scala】Scala学习资料

    Scala学习资料 java 树形 分类器_百度搜索 决策树分类器-Java实现 - CSDN博客 KNN分类器-Java实现 - CSDN博客 学习:java设计模式—分类 - 飞翔荷兰人 - 博客 ...

  8. 初步学习pg_control文件之十

    接前文 初步学习pg_control文件之九 看下面这个 XLogRecPtr checkPoint; /* last check point record ptr */ 看看这个pointer究竟保 ...

  9. Scala学习随笔——Scala起步

    实验楼学习Scala语言的笔记,课程网址为https://www.shiyanlou.com/courses/490 一.Scala简介 Scala 是一门多范式的编程语言,类似于 Java .设计初 ...

随机推荐

  1. 【Elasticsearch】Docker 安装 Elasticsearch 2.4.4 版本(高版本方式不同)

    1. 下载  elasticsearch docker pull docker.elastic.co/elasticsearch/elasticsearch:6.4.3 2.启动 elasticsea ...

  2. 爬虫实践——数据存储到Excel中

    在进行爬虫实践时,我已经爬取到了我需要的信息,那么最后一个问题就是如何把我所爬到的数据存储到Excel中去,这是我没有学习过的知识. 如何解决这个问题,我选择先百度查找如何解决这个问题. 百度查到的方 ...

  3. caps lock 映射成 esc,右Ctrl映射右移

    xmodmap -e 'clear Lock' -e 'keycode 0x42 = Escape' xmodmap -e 'clear Lock' -e 'keycode 105= Right'

  4. HearthBuddy中_settings.txt的更详细参数解释

    https://tieba.baidu.com/p/5275382967 默认的配置不是很合理,花了点时间读了下silverfish(也就是兄弟用的AI)的代码后也尝试修改了些参数,有没有效果仁者见仁 ...

  5. 性能优化 | JVM与性能优化知识点综合整理

    JVM JVM是java的核心和基础,在java编译器和os平台之间的虚拟处理器.它是一种利用软件方法实现的抽象的计算机基于下层的操作系统和硬件平台,可以在上面执行java的字节码程序. java编译 ...

  6. C++ STL——异常

    目录 一 C++异常机制概述 二 栈解旋(unwinding) 三 异常接口的声明 四 异常类型和异常变量的生命周期 五 C++标准异常库 六 异常的继承 注:原创不易,转载请务必注明原作者和出处,感 ...

  7. leetcode1284 转化为全零矩阵的最少反转次数

    m == mat.length n == mat[0].length 1 <= m <= 3 1 <= n <= 3 mat[i][j] 是 0 或 1 . BFS, 代码来自 ...

  8. 【Taro全实践】6位验证码输入视觉分离(标准下划线分离)

    一.实现的效果图 二.实现思路 中间想过很多实现方法,但是因为input为原生组件的原因,很难适配所有手机直接. 所有如何实现适配所有手机的验证码分离输入呢?(思路如下) 1.input组件为原生组件 ...

  9. 深度学习之加载VGG19模型分类识别

    主要参考博客: https://blog.csdn.net/u011046017/article/details/80672597#%E8%AE%AD%E7%BB%83%E4%BB%A3%E7%A0% ...

  10. Redis高级特性及应用场景

    Redis高级特性及应用场景 redis中键的生存时间(expire) redis中可以使用expire命令设置一个键的生存时间,到时间后redis会自动删除它. 过期时间可以设置为秒或者毫秒精度. ...