问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

使用Scala实现文件读写操作详解

创作时间:
作者:
@小白创作中心

使用Scala实现文件读写操作详解

引用
1
来源
1.
http://www.cdweb.net/article/igijip.html

本文详细介绍了使用Scala进行文件读写操作的各种方法,包括读取行、读取字符、读取词法单元和数字、读取二进制文件、写入文本文件、访问文件目录、序列化以及正则表达式等。通过丰富的代码示例,帮助读者全面掌握Scala文件操作的相关知识。

读取行

要读取文件的所有行,可以使用scala.io.Source对象的getLines方法:

val source = Source.fromFile("a.txt", "utf-8")
val lineIterator = source.getLines

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

for (i <- lineIterator) println(i)

也可以使用迭代器的toArraytoBuffer方法,将这些行放到数组或数组缓冲区中。若想将读取的文件作为一个字符串,只需:

val contents = source.mkString

下面是读取桌面上的a.txt文件的完整代码示例:

object ReadFile {
  def main(args: Array[String]): Unit = {
    val read = new ReadFile()
    val resource: String = "C:\\Users\\DonnieGao\\Desktop\\a.txt"
    val encode = "UTF-8"
    read.readFile(resource, encode)
    println(read.readFileToStr(resource, encode))
  }
}

class ReadFile {
  /**
   * 一行行读取文件的内容
   *
   * @param resource 文件路径
   * @param code 文件编码格式
   */
  def readFile(resource: String, code: String): Unit = {
    var source: BufferedSource = null
    try {
      // 获取文件的Source对象,第一个参数是文件的路径,第二个文件的编码格式
      source = Source.fromFile(resource, code)
      val lineIterator = source.getLines()
      while (true) {
        if (lineIterator.hasNext) {
          println(lineIterator.next())
        } else {
          return
        }
      }
    } finally {
      // 释放资源
      source.close()
    }
  }

  /**
   * 将文本文件所有内容作为字符串
   *
   * @param resource 文件路径
   * @param code 文件编码格式
   * @return
   */
  def readFileToStr(resource: String, code: String): String = {
    // 获取文件的Source对象,第一个参数是文件的路径,第二个文件的编码格式
    var source: BufferedSource = null
    try {
      source = Source.fromFile(resource, code)
      source.mkString
    } finally {
      source.close()
    }
  }
}

读取字符

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

读取词法单元和数字

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

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

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

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

读取二进制文件

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进行文件写入操作,例如使用java.io.PrintWriter

def write(): Unit = {
  val out = new PrintWriter("C:\\Users\\DonnieGao\\Desktop\\test.txt")
  for (i <- 0 to 100) out.println(i)
  out.close()
}

访问文件目录

Scala中没有直接访问某个目录下的所有文件的方式或者递归遍历有目录的类,可以使用Java的File类:

def dir(dir: String) = {
  val dirFile = new File(dir)
  val arrayFile = dirFile.listFiles()
  for (i <- arrayFile) {
    println(arrayFile.toBuffer)
  }
}

序列化

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

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

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

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

正则表达式

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

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

通过上述内容,读者可以全面掌握使用Scala进行文件读写操作的各种方法。这些知识对于Scala开发者来说非常实用,可以帮助他们更好地处理文件操作相关的任务。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号