美文网首页
数据读写

数据读写

作者: 井底蛙蛙呱呱呱 | 来源:发表于2021-11-17 00:16 被阅读0次

在scala语言的Source单例对象中,提供了一些非常便捷的方法,从而使开发者可以跨素的从指定的数据源(文本文件,URL地址等)中获取数据,在使用Source单例对象之前,需要先导包,即import scala.io.SourceSource类扩展自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()

相关文章

  • Sharing-Sphere之Spring Boot配置

    配置示例 数据分片 + 读写分离 配置项说明 数据分片 读写分离

  • Sharding-JDBC-Java配置

    JAVA配置 配置示例 数据分片 读写分离 数据分片 + 读写分离 数据分片 + 数据脱敏 治理 配置项说明 数据...

  • sklearn聚类

    数据的读写: numpy读写数据: pandas读写: 2、聚类 1、使用sklearn做聚类很简单,下面我们使用...

  • 第一章:初识Hadoop

    1.2数据存储与分析 数据量增大,使得传统的数据读写速度跟不上,需要通过分布式存储提高读写速度。 分布式读写数据需...

  • Sharding-JDBC-Yaml配置

    YAML配置 配置示例 数据分片 读写分离 数据分片 + 读写分离 数据分片 + 数据脱敏 治理 配置项说明 co...

  • 文件和io(cookbook笔记)

    读写文本数据 读写文本数据 读写各种不同编码的文本数据 使用带有 rt 模式的 open() 函数读取文本文件 写...

  • 11 MySQL 读写分离

    MySQL 数据读写分离 [TOC] 读写分离概述 什么是读写分离 把客户端访问数据库服务时的查询请求和写数据的请...

  • 数据读写分离、多实例配置

    数据读写分离 读写分离概述 使用读写分离的原因 数据库写入效率要低于读取效率 一般来说,数据读取频率高于写入频率 ...

  • mysql读写分离

    mysql读写分离 1、读写分离的介绍 MySQL读写分离基本原理是让master数据库处理写操作,slave数据...

  • C语言实战开发篇-9 文件结构

    文件读写 字符读写函数 :fgetc和fputc字符串读写函数:fgets和fputs数据块读写函数:fre...

网友评论

      本文标题:数据读写

      本文链接:https://www.haomeiwen.com/subject/dvcxtrtx.html