- Source.fromFile().getLines.toArray输出文件的所有行。
- Source.fromFile().mkString以字符串形式输出文件内容。
- 将字符串转换成数字,可以用toInt或toDouble方法。
- 用java的PrintWriter来写入文本文件。
- "正则".r是一个Regex对象。
- 如果你的正则表达式包含反斜杠或引号的话,用"""..."""
行操作
import scala.io.Source
val source = Source.fromFile("myfile.txt","UTF-8")
//第一个参数可以使字符串或java.io.File
val lineIterator = source.getLines//结果是一个迭代器
val lines = source.getLines.toArray
val contents = source.mkString
//把整个文件读取成一个字符串
读取字符
要从文件中读取单个字符,可以直接把Source对象当做迭代器:
for (c <- source)
读取词法单元和数字
val tokens = source.mkString.split("\\s+")
//把整个文件读取成一个字符串
读取二进制文件
scala并没有提供读取二进制文件的方法,你需要使用java类库。
val file = new File(filename)
val in = new FileInputStream(file)
val bytes = new Array[Byte](file.length.toInt)
in.read(bytes)
in.close()
写入文本文件
scala没有内建的对写入文件的支持。可以使用java.io.PrintWriter
val out = new PrintWriter("number.txt")
for(i <- 1 to 100) out.println(i)
out.close()
如果你传递数字给printf函数,编译器会抱怨你传递的不是字符串。可以受用String类的format方法
out.print("%6d %10.2f".format(quantity,price))
访问目录
目前没有正式的用来访问某个目录中的所有文件的类。我们可以自己实现一个:
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)) process(d)
正则表达式
scala.util.matching.Regex类是scala的正则表达式引擎。可以用String类的r方法构造一个Regex对象:
val numPattern = "[0-9]+".r
//如果正则表达式包含反斜线或者引号,最好使用""".."""语法
val wsnumwsPattern = """"\s+[0-9]+\s+""".r
- findAllIn方法返回遍历所有匹配项的迭代器
- findFirstIn方法返回遍历中首个匹配项,类型是Option[String]
- replaceAllIn方法替换所有匹配项
- replaceFirstIn方法替换首个匹配项
val matches = numPattern.findAllIn("99 bottles, 98 bottles").toArray
//Array(99,98)
val m1 = wsnumwsPattern .findFirstIn("99 bottles, 98 bottles")
//Some("98")
numPattern.replaceAllIn("99 bottles, 98 bottles","xx")
//"xx bottles, xx bottles"
正则表达式分组
分组可以让我们方便的获取正则表达式的子式子。
val numitemPattern = "([0-9]+) ([a-z]+)".r
val numitemPattern(num , item) = "99 bottles"
///num 99,item bottles
Comments !