[关闭]
@amoszhou 2014-05-13T07:25:26.000000Z 字数 1840 阅读 1321

文件与正则

scala


1. 读取行

要读取文件中所有的行,可以用scala.io.SourcegetLines()

  1. import scala.io.Source
  2. object FileReader extends App{
  3. val source = Source.fromFile("D:/modify.sql")
  4. val ite = source.getLines()
  5. for (line <- ite ) {
  6. println(line)
  7. }
  8. source.close()
  9. }

有时候我们想直接将一个文件读取成一个字符串,进行处理。那么更简,直接用source.mkString,返回的就是一个String。

2. 读取字符

要从文件中读取单个字符,你可以直接把Source对象当做迭代器,Source是扩展至Iterator[Char]

  1. for ( c <- source) {
  2. //处理c,c就是一个Char
  3. }

如果只想查看某个字符,又不处理它的话。可以掉用source.buffered,然后用head取值

  1. val source = Source.fromFile("D:/modify.sql")
  2. val iter = source.buffered
  3. while(iter.hasNext){
  4. if( iter.head == 'u'){
  5. //doSomething
  6. }
  7. }

当然,如果文件不是很大,你直接整个文件读成String进行处理更方便。

3.从URL或其它资源读取

处理方式还是一样,只是构建Source对象的不一样了。

  1. val source = Source.fromURL("http://www.baidu.com", "UTF-8")
  2. val source2 = Source.fromString("Hello world") //主要用于调试
  3. val source3 = Source.stdin

4. 读取二进制文件

scala目前没有提供这样的方法,所以只能用java实现。

  1. val file = new File(filename)
  2. val in = new FileInputStream(file)
  3. val bytes = new Array[Byte](file.length.toInt)
  4. in.read(bytes)
  5. in.close()

5.写入文件

同样scala也没有提供方法,所以也只能用Java来完成

5.序列化

  1. @SerialVersionUID(42L) class Person exnteds Serializable{}

如果能接受缺少的UID,连前面的注解都可以省掉。序列化与反序列化还是要用java的ObjectOutputStrean

6.正则表达式

正则表达式的语法基本上都是一样的。主要是有几个构建方法问题:
首先,要构建一个Regex对象,可以用String的.r方法:

  1. val reg = """\s+[0-9]+\s+""".r
  2. for(matchString <- reg.findAllIn("99 foo, 98 bar")){
  3. //处理....
  4. }

有一个比较爽的东西就是“原始字符串”,即""".."""这样。就可以避免掉Java里面的转义。这样的字符串,你的值是怎么样就是怎么样。再也不用去纠结于转义符用的对不对了。
findAllIn返回的是一个迭代器。也可以将迭代器转换成数组。调用toArray

如果要找到首个匹配项,可以用findFirstIn。得到的结果是一个Option[String]。类似的方法还有,检查某个字符串开始部分能否匹配findPrefixOf
用于替换的方法,则对应有replaceFirstIn,replaceAllIn.

7.正则分组

直接用()括起来

  1. val numItemPattern = "([0-9]+) ([a-z]+)".r
  2. val numItemPattern(num,item) = "99 foo"
  3. println("num:" + num)
  4. println("item:" + item)

会打印出:99 foo
如果想要从多个匹配项中提取内容,就用for。

  1. val numItemPattern = "([0-9]+) ([a-z]+)".r
  2. val numItemPattern(num,item) = "99 foo"
  3. println("num:" + num)
  4. println("item:" + item)
  5. for(numItemPattern(num,item) <- numItemPattern.findAllIn("99 foo, 98 bar")){
  6. println("num:" + num)
  7. println("item:" + item)
  8. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注