经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 其他 » 正则表达式 » 查看文章
Scala的文件读写操作与正则表达式
来源:jb51  时间:2018/9/25 19:04:43  对本文有异议

目录

在本篇文章中你将会学习并了解常用的文件处理任务,例如读取文件的一行文本,本博客的要点包含:

1.Source.fromFile(...).getLines.toArray 输出文件所有行
2.Source.fromFile(...).mkString 以字符串形式输出文件内容
3.将字符串转换为数字,可以使用toInt或toDouble方法
4.使用java的PrintWriter写入文本文件
5.“正则”.r是一个Regex对象
6.若你的正则表达式包含反斜杠或者引号,请用"""..."""
7.正则模式包含分组,可以使用for(regex(变量1...,变量2)<- 字符串)

本篇文章要点如下:

读取行

  1. // 读取文件所有的行,可以调用scala.io.Source对象的getLines方法:
  2. val source = Source.fromFile("a.txt","utf-8")
  3. val lineIterator = source.getLines

结果是迭代器可以使用for循环处理这些行

for(i <- lineIterator) println(i)

也可以使用迭代器应用toArray或toBuffer方法,将这些行放到数组力或者数组缓冲行中,若想将读取的的文件作为一个字符串,只需val conents = source.mkString

下面是简单的代码实例:读取桌面上的a.txt

  1. object ReadFile {
  2. def main(args: Array[String]): Unit = {
  3. val read = new ReadFile()
  4. val resource: String = "C:\\Users\\DonnieGao\\Desktop\\a.txt"
  5. val encode = "UTF-8"
  6. read.readFile(resource, encode)
  7. println(read.readFileToStr(resource, encode))
  8. }
  9. }
  10.  
  11. class ReadFile {
  12. /**
  13. * 一行行读取文件的内容
  14. *
  15. * @param resource 文件路径
  16. * @param code 文件编码格式
  17. */
  18. def readFile(resource: String, code: String): Unit = {
  19. var source: BufferedSource = null
  20. try {
  21. // 获取文件的Source对象,第一个参数是文件的路径,第二个文件的编码格式
  22. source = Source.fromFile(resource, code)
  23. val lineIterator = source.getLines()
  24. while (true) {
  25. if (lineIterator.hasNext) {
  26. println(lineIterator.next())
  27. } else {
  28. return
  29. }
  30. }
  31. } finally {
  32. // 释放资源
  33. source.close()
  34. }
  35. }
  36.  
  37. /**
  38. * 将文本文件所有内容作为字符串
  39. *
  40. * @param resource 文件路径
  41. * @param code 文件编码格式
  42. * @return
  43. */
  44. def readFileToStr(resource: String, code: String): String = {
  45. // 获取文件的Source对象,第一个参数是文件的路径,第二个文件的编码格式
  46. var source: BufferedSource = null
  47. try {
  48. source = Source.fromFile(resource, code)
  49. source.mkString
  50. } finally {
  51. source.close()
  52. }
  53. }
  54. }

读取字符

要将文件中读取单个字符,可以把Source对象当作迭代器,若仅仅只是想查看字符可以调用Source对象的buffered方法。

读取词法单元和数字

读取源文件中所有空格隔开的词法单元

val tokens = source.mkString.split("\\s+")

若有个基本都是浮点型的文件,可以将其读取到数组中:

  1. val numbers = for (w <- tokens) yield w.toDouble 或者也可
  2. val numbers = token.map(_.toDouble)

读取二进制文件

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()

写入文本文件

Scala没有内建对写入文件的支持,可借助java进行文件写入操作例如使用java.io.PrintWriter

  1. /**
  2. * Scala写入文借助java的PrintWriter
  3. */
  4. def write(): Unit = {
  5. val out = new PrintWriter("C:\\Users\\DonnieGao\\Desktop\\test.txt")
  6. for (i <- 0 to 100) out.println(i)
  7. out.close()
  8. }

访问文件目录

Scala中没有直接访问某个目录下的所有文件的方式或者递归遍历有目录的类

  1. /**
  2. * 使用java列举下所有的文件夹
  3. * @param dir 文件目录路径
  4. */
  5. def dir(dir:String) = {
  6. val dirFile = new File(dir)
  7. val arrayFile= dirFile.listFiles()
  8. for (i <- arrayFile){println(arrayFile.toBuffer)}
  9. }

序列化

在java中声明一个可以被序列号的类通常是下面这种:

  1. public class Person implements java.io.Serializable {
  2. private static final long serialVersionUID = 4436475322569107137L;
  3. }

Scala中声明一个可以被序列化的类通常是下面这种:

  1. @SerialVersionUID(12356L) class ReadFile extends Serializable {
  2. }

正则表达式

Scala中提供了正则操作处理scala.util.matching.Regex让这件事情可以变得简单。构造一个Regex对象,用String类的r方法即可

  1. object RegexDemo {
  2. def main(args: Array[String]): Unit = {
  3. // 初始化正则对象
  4. val numPattern = "[0-9]+".r
  5. val regex = "13 welcome to beijing"
  6. // findAllIn方法返回遍历所有匹配的迭代器,可以在for循环中使用
  7. for (matchString <- numPattern.findAllIn(regex)) {
  8. println(matchString)
  9. }
  10. // 查询字符串首个匹配项
  11. println(numPattern.findFirstIn(regex))
  12. // 检查某个字符串的开始部分能匹配,可以使用findPrefixOf
  13. println(numPattern.findPrefixOf(regex))
  14. }

总结

以上所述是小编给大家介绍的Scala的文件读写操作与正则表达式 ,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对w3xue网站的支持!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号