【scala系列】13、Scala IO 、 XML


1. IO

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14

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

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
26
27
28
29
30
31
32
33
34
35

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 访问属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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 格式化输出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

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 模式匹配

1
2
3
4
5
6
7
8
9
10
11
12

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