二维码
微世推网

扫一扫关注

当前位置: 首页 » 快报资讯 » 今日快报 » 正文

Scala_IO操作_流操作_读写操作

放大字体  缩小字体 发布日期:2021-12-23 13:50:20    作者:田庆瑞    浏览次数:339
导读

2、读取数据在Scala语言得 Source单例对象中 中, 提供了一些非常便捷得方法, 从而使开发者可以快速得从指定数据源(文感谢 件, URL地址等)中获取数据, 在使用 Source单例对象 之前, 需要先导包, 即 import scala.io.Source .1.1 按行读取我们可以以 行 为单位, 来读取数据源中得数据, 返回值是一个 迭代器类型得对象 . 然后


2、读取数据

在Scala语言得 Source单例对象中 中, 提供了一些非常便捷得方法, 从而使开发者可以快速得从指定数据源(文感谢 件, URL地址等)中获取数据, 在使用 Source单例对象 之前, 需要先导包, 即 import scala.io.Source .

1.1 按行读取

我们可以以 行 为单位, 来读取数据源中得数据, 返回值是一个 迭代器类型得对象 . 然后通过 toArray, toList 方 法, 将这些数据放到数组或者列表中即可.

  • 注意: Source类扩展自Iterator[Char] 格格式

    //1. 获取数据源文件对象.val source:BufferedSource = Source.fromFile("数据源文件得路径","编码表")//2. 以行为单位读取数据.val lines:Iterator[String] = source.getLines()//3. 将读取到得数据封装到列表中.val list1:List[String] = lines.toList//4. 千万别忘记关闭Source对象.source.close()示例

    import scala.io.Source//案例: 演示读取行.object ClassDemo01 { def main(args: Array[String]): Unit = { //1. 获取数据源对象. val source = Source.fromFile("./data/1.txt") //2.通过getLines()方法, 逐行获取文件中得数据. var lines: Iterator[String] = source.getLines() //3. 将获取到得每一条数据都封装到列表中. val list1 = lines.toList //4. 打印结果 for (s <- list1) println(s) //5. 记得关闭source对象. source.close() }}1.2 按字符读取

    Scala还提供了 以字符为单位读取数据 这种方式, 这种用法类似于迭代器, 读取数据之后, 我们可以通过 hasNext(), next()方法 , 灵活得获取数据.

    //1. 获取数据源文件对象.val source:BufferedSource = Source.fromFile("数据源文件得路径","编码表")//2. 以字符为单位读取数据.val iter:BufferedIterator[Char] = source.buffered//3. 将读取到得数据封装到列表中.while(iter.hasNext) { print(iter.next())}//4. 千万别忘记关闭Source对象.source.close()

  • 注意: 如果文件不是很大, 我们可以直接把它读取到一个字符串中.

    val str:String = source.mkString

    import scala.io.Source//案例: 演示读取单个字符.object ClassDemo02 { def main(args: Array[String]): Unit = { //1. 获取数据源对象. val source = Source.fromFile("./data/1.txt") //2. 获取数据源文件中得每一个字符. val iter = source.buffered //这里, source对象得用法相当于迭代器. //3. 通过hasNext(), next()方法获取数据. while (iter.hasNext) { print(iter.next()) //细节, 这里不要用println(), 否则输出结果可能不是你想要得. } //4. 通过mkString方法, 直接把文件中得所有数据封装到一个字符串中. val str = source.mkString //5. 打印结果. println(str) //6. 关闭source对象, 节约资源, 提高效率. source.close() }}1.3 读取词法单元和数字

    所谓得词法单元指得是以特定符号间隔开得字符串 , 如果数据源文件中得数据都是 数字形式得字符串 , 我们可以很方便得从文件中直接获取这些数据, 例如

    10 2 511 25 1 3 2

    //1. 获取数据源文件对象.val source:BufferedSource = Source.fromFile("数据源文件得路径","编码表")//2. 读取词法单元.// \s表示空白字符(空格, \t, \r, \n等)val arr:Array[String] = source.mkString.split("\\s+")//3. 将字符串转成对应得整数val num = strNumber.map(_.toInt)//4. 千万别忘记关闭Source对象.source.close()示例

    import scala.io.Source//案例: 读取词法单元和数字.object ClassDemo03 { def main(args: Array[String]): Unit = { val source = Source.fromFile("./data/2.txt") // \s表示空白字符(空格, \t, \r, \n等) val strNumber = source.mkString.split("\\s+") //将字符串转成对应得整数 val num = strNumber.map(_.toInt) for (a <- num) println(a + 1) }}1.4 从URL或者其他源读取数据

    Scala中提供了一种方式, 可以让我们直接从指定得URL路径, 或者其他源(例如: 特定得字符串)中直接读取数据。

  • 从URL地址中读取数据

    //1. 获取数据源文件对象.
    val source = Source.fromURL("特别udxd.com")
    //2. 将数据封装到字符串中并打印.
    println(source.mkString)

    1.5 读取二进制文件

    Scala没有提供读取二进制文件得方法, 我们需要通过Java类库来实现.

    示例

    import java.io.{File, FileInputStream}//案例: 读取二进制文件数据.object ClassDemo05 { def main(args: Array[String]): Unit = { val file = new File("./data/04.png") 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 往文件中写入指定数据示例

    import java.io.FileOutputStream//案例: 写入数据到文感谢件.object ClassDemo06 { def main(args: Array[String]): Unit = { val pw = new FileOutputStream("./data/3.txt") pw.write("好好学习,\r\n".getBytes()) pw.write("天天向上!".getBytes()) pw.close() }}2.2 序列化和反序列化

    在Scala中, 如果想将对象传输到其他虚拟机, 或者临时存储, 就可以通过 序列化和反序列化 来实现了.

    序列化: 把对象写到文件中得过程.反序列化: 从文件中加载对象得过程.

  • 注意: 一个类得对象要想实现序列化和反序列化操作, 则该类必须继承 Serializable特质 .

    import java.io.{FileInputStream, ObjectInputStream}//案例: 演示序列化和反序列化操作.object ClassDemo07 { case class Person(var name: String, var age: Int) def main(args: Array[String]): Unit = { //序列化操作. //反序列化操作. val ois = new ObjectInputStream(new FileInputStream("./data/4.txt")) var p: Person = ois.readObject().asInstanceOf[Person] println(p) }}



  •  
    (文/田庆瑞)
    免责声明
    • 
    本文仅代表发布者:田庆瑞个人观点,本站未对其内容进行核实,请读者仅做参考,如若文中涉及有违公德、触犯法律的内容,一经发现,立即删除,需自行承担相应责任。涉及到版权或其他问题,请及时联系我们删除处理邮件:weilaitui@qq.com。
     

    Copyright©2015-2025 粤公网安备 44030702000869号

    粤ICP备16078936号

    微信

    关注
    微信

    微信二维码

    WAP二维码

    客服

    联系
    客服

    联系客服:

    24在线QQ: 770665880

    客服电话: 020-82301567

    E_mail邮箱: weilaitui@qq.com

    微信公众号: weishitui

    韩瑞 小英 张泽

    工作时间:

    周一至周五: 08:00 - 24:00

    反馈

    用户
    反馈