@amoszhou
2014-05-13T07:25:26.000000Z
字数 1840
阅读 1321
scala
要读取文件中所有的行,可以用scala.io.Source
的getLines()
。
import scala.io.Source
object FileReader extends App{
val source = Source.fromFile("D:/modify.sql")
val ite = source.getLines()
for (line <- ite ) {
println(line)
}
source.close()
}
有时候我们想直接将一个文件读取成一个字符串,进行处理。那么更简,直接用source.mkString
,返回的就是一个String。
要从文件中读取单个字符,你可以直接把Source对象当做迭代器,Source是扩展至Iterator[Char]
for ( c <- source) {
//处理c,c就是一个Char
}
如果只想查看某个字符,又不处理它的话。可以掉用source.buffered
,然后用head
取值
val source = Source.fromFile("D:/modify.sql")
val iter = source.buffered
while(iter.hasNext){
if( iter.head == 'u'){
//doSomething
}
}
当然,如果文件不是很大,你直接整个文件读成String进行处理更方便。
处理方式还是一样,只是构建Source对象的不一样了。
val source = Source.fromURL("http://www.baidu.com", "UTF-8")
val source2 = Source.fromString("Hello world") //主要用于调试
val source3 = Source.stdin
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来完成
@SerialVersionUID(42L) class Person exnteds Serializable{}
如果能接受缺少的UID,连前面的注解都可以省掉。序列化与反序列化还是要用java的ObjectOutputStrean
正则表达式的语法基本上都是一样的。主要是有几个构建方法问题:
首先,要构建一个Regex对象,可以用String的.r方法:
val reg = """\s+[0-9]+\s+""".r
for(matchString <- reg.findAllIn("99 foo, 98 bar")){
//处理....
}
有一个比较爽的东西就是“原始字符串”,即""".."""这样。就可以避免掉Java里面的转义。这样的字符串,你的值是怎么样就是怎么样。再也不用去纠结于转义符用的对不对了。
findAllIn
返回的是一个迭代器。也可以将迭代器转换成数组。调用toArray
如果要找到首个匹配项,可以用findFirstIn
。得到的结果是一个Option[String]。类似的方法还有,检查某个字符串开始部分能否匹配findPrefixOf
。
用于替换的方法,则对应有replaceFirstIn
,replaceAllIn
.
直接用()括起来
val numItemPattern = "([0-9]+) ([a-z]+)".r
val numItemPattern(num,item) = "99 foo"
println("num:" + num)
println("item:" + item)
会打印出:99 foo
如果想要从多个匹配项中提取内容,就用for。
val numItemPattern = "([0-9]+) ([a-z]+)".r
val numItemPattern(num,item) = "99 foo"
println("num:" + num)
println("item:" + item)
for(numItemPattern(num,item) <- numItemPattern.findAllIn("99 foo, 98 bar")){
println("num:" + num)
println("item:" + item)
}