Scala可以使用任何Java对象,而java.io.File是Scala编程中可用于读取和写入文件的对象之一。
以下是写入文件的示例程序。
import java.io._object Demo {def main(args: Array[String]) {val writer = new PrintWriter(new File("test.txt" ))writer.write("Hello Scala")writer.close()}}
从命令行读一行
有时需要从屏幕上读取用户输入,然后继续进行进一步的处理。 以下示例程序显示如何从命令行读取输入。
object Demo {def main(args: Array[String]) {print("Please enter your input : " )val line = Console.readLineprintln("Thanks, you just typed: " + line)}}
读取文件内容
从文件读取真的很简单。可以使用Scala的Source类及其对象来读取文件。以下是从前面创建的“Demo.txt”文件中读取的示例。
import scala.io.Sourceobject Demo {def main(args: Array[String]) {println("Following is the content read:" )//val source = Source.fromFile("C://Users//Administrator//Desktop//test.txt", "UTF-8")Source.fromFile("Demo.txt" ).foreach {}}}
遍历一个文件中的每一行
必须导入scala.io.Source类: import scala.io.Source
方法一: 使用Source.getLines返回的迭代器
val source = Source.fromFile("C://Users//Administrator//Desktop//test.txt", "UTF-8")val lineIterator = source.getLinesfor (line <- lineIterator) println(line)
方法二: 将Source.getLines返回的迭代器,转换成数组
这里说明一点: 一个BufferedSource对象的getLines方法,只能调用一次,一次调用完之后,遍历了迭代器里所有的内容,就已经把文件里的内容读取完了
如果反复调用source.getLines,是获取不到内容的
此时,必须重新创建一个BufferedSource对象
val source = Source.fromFile("C://Users//Administrator//Desktop//test.txt", "UTF-8")val lines = source.getLines.toArrayfor(line <- lines) println(line)
- 方法三: 调用Source.mkString,返回文本中所有的内容
使用完BufferedSource对象之后,调用BufferedSource.close方法,关闭IO流资源val source = Source.fromFile("C://Users//Administrator//Desktop//test.txt", "UTF-8")val lines = source.mkString
遍历一个文件中的每一个字符
BufferedSource,也实现了一个Iterator[Char]的这么一个traitval source = Source.fromFile("C://Users//Administrator//Desktop//test.txt", "UTF-8")for(c <- source) print(c)
从URL以及字符串中读取字符
val source = Source.fromURL("http://www.baidu.com", "UTF-8")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()
<a name="RQwIz"></a>## 写文件```scalaval pw = new PrintWriter("C://Users//Administrator//Desktop//test4.txt")pw.println("Hello World")pw.close()
递归遍历子目录
def getSubdirIterator(dir: File): Iterator[File] = {val childDirs = dir.listFiles.filter(_.isDirectory)childDirs.toIterator ++ childDirs.toIterator.flatMap(getSubdirIterator _)}val iterator = getSubdirIterator(new File("C://Users//Administrator//Desktop"))for(d <- iterator) println(d)
序列化以及反序列化(Java序列化和反序列化机制)
如果要序列化,那么就必须让类,有一个@SerialVersionUID,定义一个版本号
要让类继承一个Serializable trait
@SerialVersionUID(42L) class Person(val name: String) extends Serializableval leo = new Person("leo")import java.io._val oos = new ObjectOutputStream(new FileOutputStream("C://Users//Administrator//Desktop//test.obj"))oos.writeObject(leo)oos.close()val ois = new ObjectInputStream(new FileInputStream("C://Users//Administrator//Desktop//test.obj"))val restoredLeo = ois.readObject().asInstanceOf[Person]restoredLeo.name
