Scala——文件和正则表达式

原文发表于:http://nerd-is.in/2013-08/scala-learning-files-and-regular-expressions

读取文件

 

使用完Source后,记得需要close。

读取字符

要读取单个字符,可以直接从Source对象中进行迭代。Source类扩展自Iterator[Char]。

如果想要查看接下来的字符,但是不对其进行处理(也就是说迭代器不移动位置),可以调用Source的buffered方法,返回一个collection.BufferedIterator[Char],然后使用这个对象的head方法查看下一个字符。

 

读取词法单元和数字

 

还可以使用java.util.Scanner类来读取文件中的文本和数字。

从非文件源读取

 

 

读取二进制文件

Scala没有提供读取二进制文件的方法,需要使用Java类库。

 

写入文本文件

Scala也没有对写入文件的内建支持,依旧可以使用Java类库来实现。如:

但是在使用这里printf方法时,传递AnyVal(比如各种数字)类型给方法时,编译器会要求将其转换成AnyRef:

 

访问目录

目前没有“正式的”用来访问目录中所有文件,或递归遍历所有目录的类。(本章各种没有内建没有正式是闹哪样啊!也无所谓了,用Java类库就是了。)下面探讨一下替代方案。

遍历某目录下所有子目录的函数:

不是很好懂,可能需要查阅API文档来帮忙。

如果使用了Java 7,可以使用java.nio.file.Files类的walkFileTree方法。该类用到了FileVisitor接口。

这里提到了Java的nio包,让我记起来的确需要去学一学了,io包大概已经真满足不了现在的需求了。

在Scala中通常更偏好用函数对象来指定工作内容,而不是接口(但在本例中接口可以有更细粒度的控制)。

以下隐式转换让函数可以与接口相匹配:

这个真心有点超出太多了,放着先吧,等学了相关的知识再回来看。

序列化

使用序列化来将对象传输,或者是临时存储,序列化并不适合长期存储,会因为类的更新而出现问题。

在Scala中的序列化类:

如果可以接受缺省的UID,可以不要@SerialVersionUID注解。

序列化和反序列化:

 

进程控制(A2)

Scala设计目标之一是能在简单的脚本话任务和大型程序之间保持良好的伸缩性。

scala.sys.process包提供了用于与shell程序交互的工具。这样一来,就可以使用Scala编写shell脚本。(虽然我用了Linux不少时间了,但我还是不会bash编程啊!怎么会有这么多东西需要学啊!~来不及的感觉…)

简单例子:

ls -al ..命令将会被执行,然后将结果在标准输出中显示。

sys.process包内有从字符串到ProcessBuilder对象的隐式转换。!操作符执行的就是这个ProcessBuilder对象。返回的结果是被执行程序的返回值:成功执行是0;否则是显示错误的非0值。

如果使用!!操作符,输出会以字符串的形式返回:

还可以使用管道(不了解什么是管道的,请先学习一下Linux基础),使用#!操作符。

另外还可以使用#||和#&&来控制进程。不过这种功能还是直接使用Scala来实现更好。

可以自己指定执行进程的目录和环境变量;设置环境变量用的是一系列的对偶。

个人认为这个功能还是很强大的,可以使用现有的命令来做到大量的事情。不过是否会带来安全上的影响,以及可能会使程序变得与平台有关,还是要慎重使用。

正则表达式

与正则表达式相关的类是scala.util.matching.Regex类。要构造一个Regex对象,使用String类的r方法即可。如果正则表达式中包含反斜杠或引号之类的需要转义的字符,那么最好是使用原始(raw)字符串,以三个”号包围。

 

用findPrefixOf方法检查某个字符串的开始部分是否能够匹配。

可以用相应的replace方法来替换掉匹配的部分。

正则表达式组

分组使得获取正则表达式的子表达式更加方便。在想要提取的子表达式两侧加上圆括号:

匹配组将正则表达式对象当做“提取器”来使用:

 

你可能感兴趣的:(scala)