【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 !
评论
  目录