美文网首页
数据读写

数据读写

作者: 井底蛙蛙呱呱呱 | 来源:发表于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()
    

    相关文章

      网友评论

          本文标题:数据读写

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