【scala系列】13、Scala IO 、 XML


1. IO

import java.io._, java.nio._

object IODemo{
  def main(args: Array[String]): Unit = {
    val path = "D:\\data\\oo.txt"
    //read(path)
    //write(path)
    //copy
    netIo
  }

  // 读文件
  def read(path:String)= {
    //scala特有的是scala.io.Source
    import scala.io._

    println(Source.fromFile(path, "utf8").mkString)
    //逐行读文件内容:
    Source.fromFile(new java.io.File(path)).getLines().foreach(println)
  }

  // 写文件
  def write(path:String)={
    //直接调用java的io
    val f = new FileOutputStream(path).getChannel
    f write ByteBuffer.wrap("a little bit long ...".getBytes)
    f close
    // 或者
    // FileWriter("./out.txt", true) 为追加模式
    var out = new java.io.FileWriter(path) 
    out.write("hello\n")
    out close
  }

  // 拷贝文件内容
  def copy={
    val in_path = "D:\\data\\oo.txt"
    val out_path = "D:\\data\\oo_copy.txt"
    val in = new FileInputStream(in_path).getChannel
    val out = new FileOutputStream(out_path).getChannel
    in transferTo (0, in.size, out)
  }

  // 网络io
  def netIo: Unit ={
    import java.net.{URL, URLEncoder}
    import scala.io.Source.fromURL

    println(fromURL(new URL("https://www.baidu.com")).mkString)
    //或者指定编码:
    println(fromURL(new URL("https://www.baidu.com"))(io.Codec.UTF8).mkString)
  }

}

2. XML

2.1 生成XML


  def set(): Unit = {

    val (name, age) = ("小明", 12)
    val xml1 = <xml><name>{name}</name><age>{age}</age><address>{"北京"}</address></xml> toString;
    println(xml1)
    // <xml><name>小明</name><age>12</age><address>北京</address></xml>

    val xml2 = <xml>{(1 to 3).map(i => <index>{i}</index>)}</xml>
    println(xml2)
    //<xml><index>1</index><index>2</index><index>3</index></xml>

  }

2.2 读取XML


 def get(): Unit = {

    val xml1 = <r><index>1</index> <index>2</index> <index>3</index></r>

    val list = (xml1 \ "index").map(_.text.toInt)
    println(list) //List(1, 2, 3)

    val xml2 = <users><user name="xiaom"/></users>

    val <users>{u}</users> = xml2 //有空格会匹配不上
    println(u) //<user name="xiaom"/>

    val xml_5 = <users><user name="xioam"><age>20</age></user> <user name="xiaoh"><age>30</age></user></users>

    // 遍历所有的user
    (xml_5 \ "user").map(println(_))
    /*<user name="xioam"><age>20</age></user>
      <user name="xiaoh"><age>30</age></user>*/

    // 遍历所有 age
    (xml_5 \ "user" \ "age").map(println(_))
    /*<age>20</age>
      <age>30</age>*/

    (xml_5 \\ "age").map(println(_))
    /*<age>20</age>
      <age>30</age>*/

    (xml_5 \ "_").map(println(_))
    /*<user name="xioam"><age>20</age></user>
      <user name="xiaoh"><age>30</age></user>*/

  }

2.3 访问属性

  def getValues(): Unit ={

    val xml1 = <users><u name="xiaom"/><u name="xiaoh"/><u name="xiaog"/></users>
    (xml1 \ "u" \\ "@name")foreach println
    /*xiaom
    xiaoh
    xiaog*/

    val xml2 =
      <shopping>
        <item name="bread" quantity="3" price="2.50"/>
        <item name="milk" quantity="2" price="3.50"/>
      </shopping>

    val res = for (item <- xml2 \ "item";
                   price = (item \ "@price").text.toDouble;
                   quantity = (item \ "@quantity").text.toInt) yield (price * quantity)

    println(res) //List(7.5, 7.0)
    printf("$%.2f\n", res.sum) //$14.50

  }

2.4 格式化输出


  def xmlFormat(): Unit ={
    val xml1 = <users><u name="xiaom"/><u name="xiaoh"/><u name="xiaog"/></users>

    val formatter = new xml.PrettyPrinter(80, 4) // 行宽 80,缩进为 4  
    println(formatter formatNodes xml1)

    /*
    <users>
      <u name="xiaom"/>
      <u name="xiaoh"/>
      <u name="xiaog"/>
    </users>
    */
  }

2.5 模式匹配


def xmlMatch(): Unit ={
    println(proc(<a>apple</a>)) //It's an a: apple
    println(proc(<b>banana</b>)) //It's a b: banana
    println(proc(<c>cherry</c>)) //It's something else
}
def proc(node: scala.xml.Node): String =
    node match {
        case <a>{contents}</a> => "It's an a: " + contents
        case <b>{contents}</b> => "It's a b: " + contents
        case _ => "It's something else."
}

文章作者: hnbian
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 hnbian !
评论
 上一篇
【scala系列】14、Akka并发变成和分布式应用程序开发 【scala系列】14、Akka并发变成和分布式应用程序开发
1.介绍AKKA是java虚拟机jvm平台上构建高并发、分布式和容错应用的工具包和运行时. akka用scala语言编写,同时提供了scala和java接口 官网:https://akka.io/ ActorSystem:创建并监听act
2020-04-24
下一篇 
【scala系列】12、隐式转换、视图界定 【scala系列】12、隐式转换、视图界定
1. 隐式转换 隐式转换是scala中一种特殊的功能,能在不改动已有class设计的情况下为class添加新的方法 隐式转换是把一种类型安全地转成另一种类型,原数据类型将拥有新的数据类型的所有方法,也可以看成是对类的一种增强 定义隐式转换的
2020-04-18
  目录