特殊文件更Java(properties、XML、JSON)
上接Java文件基础:https://blog.csdn.net/biggerchong/article/details/82820567
6.7.1介绍
在C++与Java中配置文件主要是XML与JSON,Eclipse中还包含自带的properties属性文件,这种属性文件可以使用Eclipse的自带的工具创建一种properties扩展的文件,它的写入和解析相对XML、JSON较为简单。
properties:Eclipse自带属性文件,利用Java代码很方便的读取和设置;但是其可移植性弱,企业级配置文件还是以XML为主流。
XML:用来配置用户自定义或系统规定的设置信息,可以实现通过更改配置中的信息而更改程序中相应的变量配置却不必更改程序代码。(可移植性强,XML库很丰富)
JSON:是网络传输中的主要传输文件方法,当然JSON跟服务器自然就离不开了,可能这种概念最开始不会很深刻,当我接触到Java Web开发时,意识到服务器端与客户端之间的交互时利用JSON文件格式来传输的,这种传输格式非常有利于客户端,利用AJAX函数库可以直接读取,这样的页面就不会卡顿了更加友好。
6.7.2 Properties属性文件(概述)
//取得properties文件流
InputStream file=testProperties.class.getResourceAsStream("/config.properties");
proper.load(file); //将流加载到proper
//当不存在Name关键字时,取默认值
//第二个参数是设置的默认值(可设可不设)
String Name=proper.getProperty("Name","知飞翀");
String CSDN=proper.getProperty("CSDN");
String QQ=proper.getProperty("QQ");
6.7.3 XML详解(已更新)
Java中常用dom4j.jar包来实现对XML文件的各种操作,这里使用dom4j-1.6.1.jar包,它的帮助文档(https://dom4j.github.io/javadoc/1.6.1/)
XML格式:
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <--! 必须顶格写才有效 -->
<root>
<blog>知飞翀</blog>
<csdn>80</csdn>
<xxxx>你好</xxxx>
</root>
在XML第一行申明的格式中,
version=“1.0”:表明解析此XML文件的解析器的版本;
encoding="UTF-8": 使用UTF-8编码方式解析;(windows下保存文件默认按gbk编码方式保存)
standalone: no,代表该XML会依赖关联其他文件(html、css等);yes,代表此XML文件是一个独立文件。
元素:root、blog、csdn、xxxx,这种放在尖括号中的元素,第一个元素为根元素root,总体呈现树状结构。
属性:定义在元素里面, <元素名称 属性名称="属性的值"></元素名称>,属性通常提供不属于数据组成部分的信息或做标识用。
text:知飞翀、80、你好,叶子元素对应的value。
CDATA区:如果某段字符串里面有过多的字符, 并且里面包含了类似标签或者关键字的这种文字,不想让xml的解析器去解析。 那么可以使用CDATA来!
例如:<des><![CDATA[<a href="http://www.baidu.com">知飞翀</a>]]></des>
XML约束(DTD、Schema)
DTD语法自成一派, 早起就出现的。 可读性比较差;
1. 引入网络上的DTD
<!-- 引入dtd 来约束这个xml -->
<!-- 文档类型 根标签名字 网络上的dtd dtd的名称 dtd的路径
<!DOCTYPE stus PUBLIC "//UNKNOWN/" "unknown.dtd"> -->
2. 引入本地的DTD
<!-- 引入本地的DTD : 根标签名字 引入本地的DTD dtd的位置 -->
<!-- <!DOCTYPE stus SYSTEM "stus.dtd"> -->
3. 直接在XML里面嵌入DTD的约束规则
<!-- xml文档里面直接嵌入DTD的约束法则 -->
<!DOCTYPE stus [
<!ELEMENT stus (stu)>
<!ELEMENT stu (name,age)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
]>
<stus>
<stu>
<name>张三</name>
<age>18</age>
</stu>
</stus>
<!ELEMENT stus (stu)> : stus 下面有一个元素 stu , 但是只有一个
<!ELEMENT stu (name , age)> stu下面有两个元素 name ,age 顺序必须name-age
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ATTLIST stu id CDATA #IMPLIED> stu有一个属性 文本类型, 该属性可有可无
元素的个数:
+ 一个或多个
* 零个或多个
? 零个或一个
属性的类型定义
CDATA : 属性是普通文字
ID : 属性的值必须唯一
<!ELEMENT stu (name , age)> 按照顺序来
<!ELEMENT stu (name | age)> 两个中只能包含一个子元素
Schema其实就是一个xml , 使用xml的语法规则, xml解析器解析起来比较方便 , 是为了替代DTD 。但是Schema 约束文本内容比DTD的内容还要多。 所以目前也没有真正意义上的替代DTD。Schema约束要建立实例文档、约束文档。
约束文档:
<!-- xmlns : xml namespace : 名称空间 / 命名空间
targetNamespace : 目标名称空间 。 下面定义的那些元素都与这个名称空间绑定上。
elementFormDefault : 元素的格式化情况。 -->
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.itheima.com/teacher"
elementFormDefault="qualified">
<element name="teachers">
<complexType>
<sequence maxOccurs="unbounded">
<!-- 这是一个复杂元素 -->
<element name="teacher">
<complexType>
<sequence>
<!-- 以下两个是简单元素 -->
<element name="name" type="string"></element>
<element name="age" type="int"></element>
</sequence>
</complexType>
</element>
</sequence>
</complexType>
</element>
</schema>
实例文档:
<?xml version="1.0" encoding="UTF-8"?>
<!-- xmlns:xsi : 这里必须是这样的写法,也就是这个值已经固定了。
xmlns : 这里是名称空间,也固定了,写的是schema里面的顶部目标名称空间
xsi:schemaLocation : 有两段: 前半段是名称空间,也是目标空间的值 , 后面是约束文档的路径。
-->
<teachers
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.itheima.com/teacher"
xsi:schemaLocation="http://www.itheima.com/teacher teacher.xsd"
>
<teacher>
<name>zhangsan</name>
<age>19</age>
</teacher>
<teacher>
<name>lisi</name>
<age>29</age>
</teacher>
<teacher>
<name>lisi</name>
<age>29</age>
</teacher>
</teachers>
名称空间的作用
一个xml如果想指定它的约束规则, 假设使用的是DTD ,那么这个xml只能指定一个DTD , 不能指定多个DTD 。 但是如果一个xml的约束是定义在schema里面,并且是多个schema,那么是可以的。简单的说: 一个xml 可以引用多个schema约束。 但是只能引用一个DTD约束。名称空间的作用就是在 写元素的时候,可以指定该元素使用的是哪一套约束规则。 默认情况下 ,如果只有一套规则,那么都可以这么写<name>张三</name>,否则:
<aa:name></aa:name>
<bb:name></bb:name>
XML的解析
XML的解析方式常见的有两种:DOM(Document Object Model)、SAX(Simple API for XML是一种接口)
针对以上两种解析方式的API:jaxp(sun公司出品,比较繁琐)、jdom 、dom4j(由jdom分流出来,更加流行)
在Eclipse中利用dom4j创建XML:
//创建Document(加载准备)
Document x_doc=DocumentHelper.createDocument();
//添加root根元素
Element doc_root=x_doc.addElement("root");
//添加子元素
Element doc_name=doc_root.addElement("name").addText("知飞翀");
Element doc_CSDN=doc_root.addElement("CSDN").addText("https://me.csdn.net/biggerchong");
//添加属性
Element name_QQ=doc_name.addAttribute("QQ", "610254602");
//转成XML字符串
x_doc.setXMLEncoding("UTF-8");
//输出到文件
OutputFormat format= OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8"); //设置XML字符编码
File file=new File("src/config.xml"); //设置相对路径
try
{
XMLWriter writer=new XMLWriter(new FileOutputStream(file),format);
writer.write(x_doc);
writer.close();
System.out.println("config.xml文件创建成功!");
}
catch (Exception e)
{
e.printStackTrace();
}
注:文件路径这里用的是相对路径,Document相当于是整个XML的总管,它是老大;root是老二;子元素是老小。
在Eclipse中利用dom4j解析XML:
//从XML文件中读出
FileInputStream stream=new FileInputStream("src/config.xml");
SAXReader reader=new SAXReader(); //用来读取文件到Document
Document x_doc=reader.read(stream);
stream.close();
//取得根元素
Element doc_root=x_doc.getRootElement();
//从子元素中取值
//方法1
Element doc_name=doc_root.element("name");
String name=doc_name.getText();
//方法2
String CSDN= doc_root.elementText("CSDN");
//方法3
List<Element> elements=doc_root.elements(); //获取根元素下的所有元素
for(Element element:elements)//遍历
//取得属性
String QQ=doc_name.attributeValue("QQ");
注:引入dom4j自定义的SAXReader
dom4j的Xpath的使用
dom4j里面支持Xpath的写法。 xpath其实是xml的路径语言,支持我们在解析xml的时候,能够快速的定位到具体的某一个元素。引入依赖jar包(jaxen-1.1-beta-6.jar)就可以使用Xpath来轻松查找。
//要想使用Xpath, 还得添加支持的jar 获取的是第一个 只返回一个。
Element nameElement = (Element) rootElement.selectSingleNode("//name");
//获取文档里面的所有name元素
List<Element> list = rootElement.selectNodes("//name");
6.7.4 JSON详解
Java中与JSON有关的库很多,但是使用方法大同小异,这里我们在JSON官网(http://www.json.org/)中使用其中一个JSON-java的库(官方API:http://stleary.github.io/JSON-java/index.html),在github上下载整个源码后就可直接添加到src中使用了,这里我们将源码打包成json-org.jar包来使用更加方便。
JSON格式:
{
“name”: “翀哥”,
“phone”: “13277351070”
}
在MyEclipse中利用json-org创建json:
JSONObject jsonObject=new JSONObject( ); //创建JSONObject
//向JSONObject中添加数据(key--value)
jsonObject.put(“name”,name);
jsonObject.put(“phone”,phone);
String jsonStr=jsonObject.toString( ); //转换为JSON字符串传输给客户端
在MyEclipse中利用json-org解析json:
//传入jsonStr创建JSONObject
JSONObject jsonObject=new JSONObject(String jsonStr);
//从JSONObject中取出数据(key--value)
String name=jsonObject.getString(“name”);
String phone=jsonObject.getString(“phone”);
还有更多复杂的JSON格式:JSON中嵌入JSON、JSON Array等,都是按照基本方法来创建解析的。JSON中属性没有先后顺序这一说,JSON与hashMap很相似。
全部特殊文件jar包及源码上传至github:https://github.com/SCAsMessi/JavaStudy/tree/master/CSDN/Java%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/specailFile
加油!骚年们。。。