Scala--IO操作
I/O
我想大家并不陌生了,即输入/输出(Input/Output)。本篇博客,我想看标题就清楚了,就是带着大家一起来看看scala的IO操作。
读取文件
基本读取文件
读取文件我们使用scala.io.Source
,如下图所示,注意的是,在大部分读写操作的过程中就是引入了java.io
包下面的方法。
- 读取文件,常用
Source.fromFile("文件路径","字符编码")
如下图所示:
当然我们也可以使用fromIterable
、fromChar
、fromChars
、fromBytes
、fromURL
、fromInputStream
等读取信息,博客中会讲解,下面先来看看Source.fromFile。
- 主要讲解的是Source.fromFile读取文件,事例如下:
1 | ackage com.xiaoxiaomo.demo.ch09 |
- 第一个参数,可以是文件名或
java.io.File
- 第二个参数,如果没有会使用当前平台缺省的字符编码
source.getLines读取行
,结果是一个迭代器可以转换成Array等- 使用完Source后,记得需要
close
。
从URL或其他源读取
1 | package com.xiaoxiaomo.demo.ch09 |
读取词法单元和数字
在很多场景下,我们时常会遇到对读取的文件进行处理(切割,筛选等),然而我们可以读取文件后转为字符串,通过字符串的一个split
方法进行切割。事例:现在我们项目跟目录有如下文件,然后我们使用相对路径读取,代码如下:
1 | import java.io.File |
- 运行结果
1 | 23 |
可以对切割后的文件进行处理,如下,转为Double1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27import java.io.File
import scala.io.{BufferedSource, Source}
/**
* 切割后处理
* Created by xiaoxiaomo on 2016/4/6.
*/
object ReadSqlit2 {
def main(args: Array[String]) {
val source: BufferedSource = Source.fromFile(new File("test.txt"),"UTF-8")
val word = source.mkString.split("\\s+")
//转为Double
for( w <- word ) yield {
val double: Double = w.toDouble
println(double+ " ")
}
//或者通过另一种方式转换
val map: Array[Double] = word.map(_.toDouble)
for( m <- map ) {
print(m+ " - ")
}
}
}
- 运行结果
1 | 23.0 |
读取二进制文件
Scala没有提供读取二进制文件的方法,需要使用Java类库
1 | import java.io.{File, FileInputStream} |
写入文件
Scala也没有对写入文件的内建支持,依旧可以使用Java类库来实现。如:1
2
3val out = new PrintWriter("numbers.txt")
for (i <- 1 to 100) out.println(i)
out.close()
但是在使用这里printf方法时,传递AnyVal(比如各种数字)类型给方法时,编译器会要求将其转换成
1 | AnyRef: |
访问目录
目前没有“正式的”用来访问目录中所有文件,或递归遍历所有目录的类。(本章各种没有内建没有正式是闹哪样啊!也无所谓了,用Java类库就是了。)下面探讨一下替代方案。
遍历某目录下所有子目录的函数:
1 | import java.io.File |
// 调用打印出所有的子目录
反/序列化
1 | val fred = new Person(...) |