Scala可以使用任何Java对象,而java.io.File是Scala编程中可用于读取和写入文件的对象之一。
以下是写入文件的示例程序。

  1. import java.io._
  2. object Demo {
  3. def main(args: Array[String]) {
  4. val writer = new PrintWriter(new File("test.txt" ))
  5. writer.write("Hello Scala")
  6. writer.close()
  7. }
  8. }

从命令行读一行

有时需要从屏幕上读取用户输入,然后继续进行进一步的处理。 以下示例程序显示如何从命令行读取输入。

  1. object Demo {
  2. def main(args: Array[String]) {
  3. print("Please enter your input : " )
  4. val line = Console.readLine
  5. println("Thanks, you just typed: " + line)
  6. }
  7. }

读取文件内容

从文件读取真的很简单。可以使用Scala的Source类及其对象来读取文件。以下是从前面创建的“Demo.txt”文件中读取的示例。

  1. import scala.io.Source
  2. object Demo {
  3. def main(args: Array[String]) {
  4. println("Following is the content read:" )
  5. //val source = Source.fromFile("C://Users//Administrator//Desktop//test.txt", "UTF-8")
  6. Source.fromFile("Demo.txt" ).foreach {
  7. print
  8. }
  9. }
  10. }

遍历一个文件中的每一行

必须导入scala.io.Source类: import scala.io.Source

  • 方法一: 使用Source.getLines返回的迭代器

    1. val source = Source.fromFile("C://Users//Administrator//Desktop//test.txt", "UTF-8")
    2. val lineIterator = source.getLines
    3. for (line <- lineIterator) println(line)
  • 方法二: 将Source.getLines返回的迭代器,转换成数组

这里说明一点: 一个BufferedSource对象的getLines方法,只能调用一次,一次调用完之后,遍历了迭代器里所有的内容,就已经把文件里的内容读取完了
如果反复调用source.getLines,是获取不到内容的
此时,必须重新创建一个BufferedSource对象

  1. val source = Source.fromFile("C://Users//Administrator//Desktop//test.txt", "UTF-8")
  2. val lines = source.getLines.toArray
  3. for(line <- lines) println(line)
  • 方法三: 调用Source.mkString,返回文本中所有的内容
    1. val source = Source.fromFile("C://Users//Administrator//Desktop//test.txt", "UTF-8")
    2. val lines = source.mkString
    使用完BufferedSource对象之后,调用BufferedSource.close方法,关闭IO流资源

    遍历一个文件中的每一个字符

    BufferedSource,也实现了一个Iterator[Char]的这么一个trait
    1. val source = Source.fromFile("C://Users//Administrator//Desktop//test.txt", "UTF-8")
    2. for(c <- source) print(c)

    从URL以及字符串中读取字符

    1. val source = Source.fromURL("http://www.baidu.com", "UTF-8")
    2. val source = Source.fromString("Hello World")

    结合java的io流

    读取任意文件

    spark的源码是由scala和java共同编写而成的,Java的多线程
    scala,本身的编程语言的功能,就不是特别的强大和完善,比如说,scala甚至不能很方便地写文件,必须依赖于java的io流才可以
    所以说,scala,其实主要就是针对某些特定领域的一些复杂系统的,比较适用的一种编程语言而已
    完全无法替代java的,scala和java是相辅相成,荣辱与共的这么一种,共生关系
    案例: 结合java IO流,做一个文件拷贝的案例 ```scala import java.io._

val fis = new FileInputStream(new File(“C://Users//Administrator//Desktop//test.txt”)) val fos = new FileOutputStream(new File(“C://Users//Administrator//Desktop//test3.txt”))

val buf = new ArrayByte fis.read(buf) fos.write(buf, 0, 1024)

fis.close() fos.close()

  1. <a name="RQwIz"></a>
  2. ## 写文件
  3. ```scala
  4. val pw = new PrintWriter("C://Users//Administrator//Desktop//test4.txt")
  5. pw.println("Hello World")
  6. pw.close()

递归遍历子目录

  1. def getSubdirIterator(dir: File): Iterator[File] = {
  2. val childDirs = dir.listFiles.filter(_.isDirectory)
  3. childDirs.toIterator ++ childDirs.toIterator.flatMap(getSubdirIterator _)
  4. }
  5. val iterator = getSubdirIterator(new File("C://Users//Administrator//Desktop"))
  6. for(d <- iterator) println(d)

序列化以及反序列化(Java序列化和反序列化机制)

如果要序列化,那么就必须让类,有一个@SerialVersionUID,定义一个版本号
要让类继承一个Serializable trait

  1. @SerialVersionUID(42L) class Person(val name: String) extends Serializable
  2. val leo = new Person("leo")
  3. import java.io._
  4. val oos = new ObjectOutputStream(new FileOutputStream("C://Users//Administrator//Desktop//test.obj"))
  5. oos.writeObject(leo)
  6. oos.close()
  7. val ois = new ObjectInputStream(new FileInputStream("C://Users//Administrator//Desktop//test.obj"))
  8. val restoredLeo = ois.readObject().asInstanceOf[Person]
  9. restoredLeo.name