scala-读取写入序列化

1.读取数据

1.1按行读取

1
2
3
4
5
6
7
8
9
10
11
// 按行读取
// 创建Source对象,关联数据源文件
val source = Source.fromFile("J:\\大数据第一代项目\\scalaFlink\\data\\1.txt")
// 以行为单位,来读取数据
val lines: Iterator[String] = source.getLines()
// 将读取到的数据封装到list列表中
val list: List[String] = lines.toList
// 打印结果
for (data <- list) println(data)
// 关闭Source对象
source.close()

1.2按字符读取

1
2
3
4
5
6
7
8
9
10
11
// 按字符读取
val source1 = Source.fromFile("J:\\大数据第一代项目\\scalaFlink\\data\\1.txt")
// 拆干见source对象关联数据源
val iter: BufferedIterator[Char] = source1.buffered
// 已字符为单位来读取数据
while (iter.hasNext) {
// 打印读取到的数据 hasNext(), next()
print(iter.next())
}
// 关闭source对象
source.close()

1.3优化版(字符串版)

1
2
3
4
5
6
7
8
// 优化版,如果文件中的内容较少,我们可以直接把它读取到一个字符串中
val source2 = Source.fromFile("J:\\大数据第一代项目\\scalaFlink\\data\\1.txt")
// 将数据读取到一个字符串中
val str: String = source2.mkString
// 打印
println(str)
// 关闭source对象
source2.close()

1.4读取词法单词和数字

1
2
3
4
5
6
7
8
9
10
11
// 读取词法单元和数字
val source3 = Source.fromFile("J:\\大数据第一代项目\\scalaFlink\\data\\2.txt")
//将其所有数据封装到一个字符串中
val str1 = source3.mkString
// 按照空白字符进行切割,获取到字符串数组
val strArray: Array[String] = str1.split("\\s+")
// 将上诉的字符串数组转换成int类型的数组
val intArray: Array[Int] = strArray.map(_.toInt)
for (data <- intArray) print(data + " ")
// 关闭source
source3.close()

1.5从Url或者其他源中读取数据

1
2
3
4
5
6
7
8
9
10
// 从url或者其他源读取数据
//读取传智播客官网的数据
val source4 = Source.fromURL("https://www.itcast.cn")
val str2 = source4.mkString
println(str2)

// 直接从字符串 黑马程序员中读取数据
val source5 = Source.fromString("黑马程序员")
val str3 = source5.mkString
println(str3)

1.6读取二进制文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 读取二进制文件
// 创建file对象,关联数据源文件
val file = new File("J:\\大数据第一代项目\\scalaFlink\\data\\1732176591422.png")
// 创建字节输入流,关联数据源文件
val fis = new FileInputStream(file)
// 创建字节数组,用来存储读取到的内容
val bys = new Array[Byte](file.length().toInt)
// 开始读取,将读取到的数据存储到字节数组中,病返回读取到的有效字节数
val len = fis.read(bys)
// 打印结果
println("读取到的有效字节数:" + len)
println("字节数组的长度" + bys.length)
// 关闭
fis.close()

2.写入数据

1
2
3
4
5
6
7
// 写入数据
// 创建字节输出流对象,关联目的地文件
val fos = new FileOutputStream("J:\\大数据第一代项目\\scalaFlink\\data\\4.txt")
// 直接往目的地文件中编写指定的内容
fos.write("黄凯君cpdd\r\n 黄凯君mjj".getBytes)
// 关闭字节输出流
fos.close()

3.序列化和反序列化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 序列化和反序列化
// 演示序列化操作,即:将对象写入到文件中.
// 创建Person类型的对象
val p = new Person("黄凯君", 23)
// 创建序列哈流,用来讲对象写入到文件中
val oos = new ObjectOutputStream(new FileOutputStream("J:\\大数据第一代项目\\scalaFlink\\data\\5.txt"))
// 调用writeObject()方法, 将对象写入到文件中
oos.writeObject(p)
oos.close()

// 反序列化操作,即:从文件中直接读取对象
// 创建反序列化流,关联数据源文件
val ois = new ObjectInputStream(new FileInputStream("J:\\大数据第一代项目\\scalaFlink\\data\\5.txt"))
// 调用readObject()方法,从数据源文件中读取指定的对象
// 细节:我们获取到的对象是AnyRef类型,所以需要转换成Person类型
val p1 = ois.readObject().asInstanceOf[Person]
// 打印结果
println(p1.name, p1.age)
// 关闭
ois.close()

案例:学生成绩单

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// 案例:学院成绩表
// 创建source对象并且关联数据源
val source9 = Source.fromFile("J:\\大数据第一代项目\\scalaFlink\\data\\Student.txt")
// 讲数据原一行一行读出来,并且已空格为分割符存入数组
val stuArray = source9.getLines().map(_.split(" "))
// 创建可变列表
val studentList = ListBuffer[Student]()
// 将数据数组中的每一个存入列表中 这里的转换是方便添加总成绩进去,list方便动态加入
for (s <- stuArray) {
studentList += new Student(s(0), s(1).toInt, s(2).toInt, s(3).toInt)
}
// 将列表中的数据按照总分降序排列
val sortList = studentList.sortBy(_.getSum).reverse.toList
// 将处理好的数据存入指定位置
val bw = new BufferedWriter(new FileWriter("J:\\大数据第一代项目\\scalaFlink\\data\\Student1.txt"))
// 将数据写入
for (s <- sortList) {
// s 表示排序后每一个学生的信息
bw.write(s"${s.name}, ${s.Chinese}, ${s.Math}, ${s.English}, ${s.getSum}")
// 每写完一个学生进行换行
bw.newLine()
}
// 关闭
bw.close()
source9.close()