在scala语言的
Source
单例对象中,提供了一些非常便捷的方法,从而使开发者可以跨素的从指定的数据源(文本文件,URL地址等)中获取数据,在使用Source
单例对象之前,需要先导包,即import scala.io.Source
。Source
类扩展自Iterator
。
1、数据读取
1.1、按行读取
我们可以以行为单位来读取数据源中的数据,返回值是一个迭代器类型的对象
。然后通过toArray
, toList
方法,将这些数据放到数组或者列表中即可。
import scala.io.Source
// 1、获取数据源文件对象
val source:BufferedSource = Source.fromFile(文件路径,编码方式)
// 2、以行为单位读取数据
val lines: Iterator[String] = lines.getLines()
// 3、将读取到的数据封装到列表中
val lst: List[String] = lines.toList
// 4、关闭对象
source.close()
1.2、按字符读取
scala还提供了以字符为单位读取数据
这种方式,这种用法类似于迭代器,读取数据之后,我们可以通过hasNext()
,next()
方法,灵活的获取数据。
// 1、获取数据源文件对象
val source:BufferedSource = Source.fromFile(文件路径,编码方式)
// 2、以字符为单位读取数据
val iter:BufferedIterator[Char] = source.buffered
// 3、通过hasNext、next方法获取数据
while(iter.hasNext){
print(iter.next())
}
// 4、如果文件不是很大,我们可以直接把他读取到一个字符串中
val str:String = source.mkString
// 5、关闭对象
source.close()
1.3、读取此法单元和数字
所谓的词法单元是指以特定符号隔开的字符串
,如果数据源文件中的数据都是字符串形式的数字
,我们可以很方便的从文件中读取这些数据。
// 1、获取数据源文件对象
val source:BufferedSource = Source.fromFile(文件路径,编码方式)
// 2、读取词法单元
// \s表示空字符(空格,\t,\r,\n等)
val arr:Array[String] = source.mkString.split("\\s+")
// 3、将字符串转成对应的整数
val num = arr.map(_.toInt)
// 4、关闭对象
source.close()
1.4、从URL或者其他数据源读取数据
scala中提供了一种方式,可以让我们直接从指定的URL路径或者其它源(如字符串)中直接读取数据。
// 1、从URL地址中读取数据
val source = Source.fromURL("http://www.itcast.cn")
println(source.mkString)
// 2、从其它源读取数据
val source = Source.fromString("黑马程序员")
println(source.mkString)
1.5、读取二进制文件
scala中没有读取二进制文件的方法,我们需要通过Java类库来实现。
// 读取二进制文件数据(图片)
// 创建File对象,关联数据源文件
val file = new File("test.jpg")
// 创建字节输入流,用来读取数据
val fis = new FileInputStream(file)
// 创建字节数组,用来存储读取到的内容(字节)
val bys = new Array[Byte](file.length().toInt)
// 开始读取,将读取到的数据存储到字节数组中,并返回读取到的有效字节数
fis.read(bys)
fis.close()
println(bys.length)
2、写入数据
scala中并没有内建的对写入文件的支持,要写入数据到文件,还是需要使用Java的类库。
2.1 往文件中写入指定数据
// 1、创建字节数出列对象,关联目的地文件
val fos = new FileOutputStream("out.txt") // 若目的地文件不存在,程序会自动创建
// 2、直接往目的地文件中编写指定的内容
fos.write("键盘敲烂,\r\n".getBytes)
fos.write("月薪过万!".getBytes)
// 3、关闭字节输出流
fos.close()
2.2 序列化和反序列化
在scala中,如果想将对象传输到其它虚拟机或者临时储存,就可以通过序列化和反序列化来实现了。
- 序列化:把对象写到文件中的过程;
- 反序列化:从文件中加载对象的过程;
注:一个类的对象如果想要实现序列化和反序列化的操作,则该类必须继承Serializable
特质。样例类(case class ...)自动继承了Serializable
特质。
// 1、创建样例类Person
class Person(var name: String, var age:Int) extends Serializable
// 2、演示序列化操作,即将对象写入到文件中
// 2.1 创建Person对象
val p = New Person("张三", 23)
// 2.2 创建序列化流,用来将对象写入到文件中
val oos = new ObjectOutputStream(new FileOutputStream("out.txt"))
// 2.3 调用writeObject方法,将对象写入到文件中
oos.writeObject(p)
// 2.4 关闭序列化流
oos.close()
// 3、演示反序列化操作,即从文件中直接读取对象
// 3.1 创建反序列化流,关联数据源文件
val ois = new ObjectInputStream(new FileInputStream("out.txt"))
// 3.2 调用readObject()方法,从数据源中读取指定的对象
// 细节:我们获取到的对象是AnyRef类型,所以需要转换成Person类型
val p: Person = ois.readObject().asInstanceOf[Person]
println(p.name, p.age)
// 3.3 关闭反序列化流
ois.close()
网友评论