文件和正则表达式
文件读取
首先,要导入 scala.io.Source 包
通常的读取方法
val source = Source.fromFile("myfile.txt","UTF-8")
val lineIterator = source.getLines//getLines方法返回的是一个迭代器
处理方法:
for(i <- lineIterator) 处理 i
我们可以将得到的文本用mkString方法读取成一个字符串
val source = Source.fromFile("myfile.txt","UTF-8").mkString
在java中我们通常这样来做:
//省略读取操作
String[] str = s.spilt("\\s+");
将读取到的s有空格的文本通过split函数分开形成一个字符串数组,然后分别处理每个字符串。
scala中这样来做:
val source = Source.fromFile("myfile.txt","UTF-8").mkString.spilt("\\s+")
然后我们可以把每个字符串转用toInt和toDouble方法转化成所需要的来处理。
从URL或其他源读取
val source = Source.fromURL("www.baidu.com")
//从给定字符串读取
val source = Source.fromString("hello","world")
写入文件
再写文件时我们用到了 java.io 包
通常处理方法:
import java.io_
val writer = new PrintWriter("xxx.txt")
在写入时,用到print/println方法可以写入包括浮点数,整数,字符串在内的多种数据类型。
writer.print("")
scala强大在代码的简洁,可以用很少的代码实现复杂的功能。
比如:把字符数大于4的单词打印到控制台
scala:
Source.fromFile("haha.txt").mkString.split("\\s+") foreach(x => if(x.length > 4) println(x))
java
BufferedReader bReader;
try {
bReader = new BufferedReader(new FileReader("xxx.txt"));
String string = bReader.readLine();
while (string != null) {
String[] str = string.split(",");
for(int i = 0;i < str.length();i++){
if(str(i) > 4)
System.out.println(str(i));
}
string = bReader.readLine();
}
bReader.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
以上代码我个人版本,可能还有比较简单的,scala只用1行就可以达到,确实非常简洁。
访问目录
比如:处理目录中的所有文件
import java.io.File
def subdirs(dir : File) : Iterator[File] = {
//listFiles().filter 返回一个抽象路径名数组,这些路径名表示此抽象路径名中满足指定过滤器的文件
val children = dir.listFiles().filter(_.isDirectory)
//递归,收集每个文件夹中的子文件
children.toIterator ++ children.toIterator.flatMap(subduers _)
}
//递归遍历得到所有文件的一个集合
for(d <- subdirs(dir)) 处理 d
正则表达式
scala中构造一个Regex对象,用String类中的r方法
比如:
val numPattern = "[0-9]+".r
//和下面的表达式意思相同
val numPattern = "\d+".r //+代表不止一个数字
正则表达式多用来进行模式匹配,和findAllIn方法结合找到匹配项,返回值为一个迭代器。
比如
for(matchString <- numPattern.findAllIn("99 bottles,98bottles"))
处理 matchString
或者也可以转化为数组:
numPattern.findAllIn("99 bottles,98bottles").toArray
正则表达式组
通常情况下一个正则表达式并不能满足所要达到的需求,这种情况下需要用到表达式组。通常以一个圆括号为一个组:
val numitemPattern = "([0-9]+) ([a-z]+)".r
对这部分感兴趣的同学下来可以看看正则表达式的语法。