一、Properties(属性)文件
1、基本介绍
- 作用:一般用来存储系统的相关配置属性。
- 特点
(1)属性文件的内容都只能是键值对,一个键值对独占一行。
(2)属性文件中的键,不允许重复。
(3)属性文件后缀一般是以 “.properties” 结尾。
2、读写操作
- 在java中使用 Properties 类来实现对属性文件的读写操作。
- Properties类的特点
(1)它是一个Map集合(键值对集合),但是我们一般不会当集合使用。
(2)核心作用:Properties是用来代表属性文件的,通过Properties可以读写属性文件里的内容。
2.1 读取操作
// 1、创建一个Properties的对象出来(键值对集合,空容器)
Properties properties = new Properties();
System.out.println(properties);
// 2、开始加载属性文件中的键值对数据到properties对象中去
properties.load(new FileReader("properties-xml-log-app\\src\\users.properties"));
System.out.println(properties);
// 3、根据键取值
System.out.println(properties.getProperty("赵敏"));
System.out.println(properties.getProperty("张无忌"));
// 4、遍历全部的键和值。
Set<String> keys = properties.stringPropertyNames();
for (String key : keys) {
String value = properties.getProperty(key);
System.out.println(key + "---->" + value);
}
properties.forEach((k, v) -> {
System.out.println(k + "---->" + v);
});
2.2 写入操作
// 1、创建Properties对象出来,先用它存储一些键值对数据
Properties properties = new Properties();
properties.setProperty("张无忌", "minmin");
properties.setProperty("殷素素", "cuishan");
properties.setProperty("张翠山", "susu");
// 2、把properties对象中的键值对数据存入到属性文件中去
properties.store(new FileWriter("properties-xml-log-app/src/users2.properties")
, "i saved many users!");
2.3 读取后再写入
// 目标:读取属性文件,判断是否存在李元芳,存在则将年龄改为18
// 1、加载属性文件的键值对到程序中来。
Properties properties = new Properties();
// 2、开始加载
properties.load(new FileReader("properties-xml-log-app/src/users.txt"));
// 3、判断是否存在李元芳这个键
if (properties.containsKey("李元芳")) {
properties.setProperty("李元芳", "18");
}
// 4、把修改后的键值对数据重新存入到属性文件中去
properties.store(new FileWriter("properties-xml-log-app/src/users.txt"), "i updated it!");
二、XML文件
- XML( 全称EXtensible Markup Language, 可扩展标记语言 )
- 本质是一种数据的格式,可以用来存储复杂的数据结构,和数据关系。
- 应用场景:经常用来做为系统的配置文件;或者作为一种特殊的数据结构,在网络中进行传输。
1、XML的特点
- XML中的“<标签名>” 称为一个标签或一个元素,一般是成对出现的。
- XML中的标签名可以自己定义(可扩展),但必须要正确的嵌套。
- XML中只能有一个根标签。
- XML中的标签可以有属性。
- 如果一个文件中放置的是XML格式的数据,这个文件就是XML文件,后缀一般要写成.xml。
2、XML的语法规则
- XML文件的后缀名为:xml,文档声明必须是第一行
- XML中可以定义注释信息:<!–- 注释内容 -->
- XML中书写”<”、“&”等,可能会出现冲突,导致报错,此时可以用如下特殊字符替代。
- XML中可以写一个叫CDATA的数据区: <![CDATA[ …内容… ]]>,里面的内容可以随便写。
helloworld.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!-- 注释:以上抬头声明必须放在第一行,必须有 -->
<!-- 根标签只能有一个 -->
<users>
<user id="1" desc="第一个用户">
<name>张无忌</name>
<sex>男</sex>
<地址>光明顶</地址>
<password>minmin</password>
<data> 3 < 2 && 5 > 4 </data>
<data1>
<![CDATA[
3 < 2 && 5 > 4
]]>
</data1>
</user>
<people>很多人</people>
<user id="2">
<name>敏敏</name>
<sex>女</sex>
<地址>光明顶</地址>
<password>wuji</password>
<data> 3 < 2 && 5 > 4 </data>
<data1>
<![CDATA[
3 < 2 && 5 > 4
]]>
</data1>
</user>
</users>
3、读取XML文件中的数据
- 程序员并不需要自己写原始的IO流代码来解析XML,难度较大!也相当繁琐!
- 其实,有很多开源的,好用的,解析XML的框架,最知名的是:Dom4j(第三方研发的)
// 1、创建一个Dom4J框架提供的解析器对象
SAXReader saxReader = new SAXReader();
// 2、使用saxReader对象把需要解析的XML文件读成一个Document对象。
Document document =
saxReader.read("properties-xml-log-app\\src\\helloworld.xml");
// 3、从文档对象中解析XML文件的全部数据了
Element root = document.getRootElement();
System.out.println(root.getName());
// 4、获取根元素下的全部一级子元素。
// List<Element> elements = root.elements();
List<Element> elements = root.elements("user");
for (Element element : elements) {
System.out.println(element.getName());
}
// 5、获取当前元素下的某个子元素。
Element people = root.element("people");
System.out.println(people.getText());
// 如果下面有很多子元素user,默认获取第一个。
Element user = root.element("user");
System.out.println(user.elementText("name"));
// 6、获取元素的属性信息呢?
System.out.println(user.attributeValue("id"));
Attribute id = user.attribute("id");
System.out.println(id.getName());
System.out.println(id.getValue());
List<Attribute> attributes = user.attributes();
for (Attribute attribute : attributes) {
System.out.println(attribute.getName() + "=" + attribute.getValue());
}
// 7、如何获取全部的文本内容:获取当前元素下的子元素文本值
System.out.println(user.elementText("name"));
System.out.println(user.elementText("地址"));
System.out.println(user.elementTextTrim("地址")); // 取出文本去除前后空格
System.out.println(user.elementText("password"));
Element data = user.element("data");
System.out.println(data.getText());
System.out.println(data.getTextTrim()); // 取出文本去除前后空格
4、将数据写入到XML文件中
- 不建议用Dom4j来做。
- 推荐直接把程序里的数据拼接成XML格式,然后用IO流写出去。
// 1、使用一个StringBuilder对象来拼接XML格式的数据。
StringBuilder sb = new StringBuilder();
sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\r\n");
sb.append("<book>\r\n");
sb.append("\t<name>").append("从入门到跑路").append("</name>\r\n");
sb.append("\t<author>").append("zhoujielun").append("</author>\r\n");
sb.append("\t<price>").append(999.99).append("</price>\r\n");
sb.append("</book>");
try (
BufferedWriter bw = new BufferedWriter(new FileWriter("properties-xml-log-app/src/book.xml"));
){
bw.write(sb.toString());
} catch (Exception e) {
e.printStackTrace();
}
5、补充知识:约束XML文件的编写[了解]
- 什么是约束XML文件的书写?—— 就是限制XML文件只能按照某种格式进行书写。
5.1 约束文档
- 专门用来限制xml书写格式的文档,比如:限制标签、属性应该怎么写。
5.2 约束文档的分类
- DTD文档
- Schema文档
5.3 DTD文档
- 定义data.dtd文档
<!ELEMENT 书架 (书+)>
<!ELEMENT 书 (书名,作者,售价)>
<!ELEMENT 书名 (#PCDATA)>
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 售价 (#PCDATA)>
- 在book1.xml文件中引用dtd文档
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE 书架 SYSTEM "data.dtd">
<书架>
<书>
<书名>从入门到删库</书名>
<作者>小猫</作者>
<售价>很便宜</售价>
</书>
<书>
<书名>从入门到删库</书名>
<作者>小猫</作者>
<售价>9.9</售价>
</书>
<书>
<书名>从入门到删库</书名>
<作者>小猫</作者>
<售价>9.9</售价>
</书>
</书架>
5.4 Schema文档
- 定义data.xsd文档
<?xml version="1.0" encoding="UTF-8" ?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.csdn.net"
elementFormDefault="qualified" >
<!-- targetNamespace:申明约束文档的地址(命名空间),可以是域名-->
<element name='书架'>
<!-- 写子元素 -->
<complexType>
<!-- maxOccurs='unbounded': 书架下的子元素可以有任意多个!-->
<sequence maxOccurs='unbounded'>
<element name='书'>
<!-- 写子元素 -->
<complexType>
<sequence>
<element name='书名' type='string'/>
<element name='作者' type='string'/>
<element name='售价' type='double'/>
</sequence>
</complexType>
</element>
</sequence>
</complexType>
</element>
</schema>
- 在book2.xml文件中引用schema文档
<?xml version="1.0" encoding="UTF-8" ?>
<书架 xmlns="http://www.csdn.net"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.csdn.net data.xsd">
<!-- xmlns="http://www.csdn.net" 基本位置
xsi:schemaLocation="http://www.csdn.net books02.xsd" 具体的位置 -->
<书>
<书名>从入门到删除</书名>
<作者>zhangsan</作者>
<售价>9.9</售价>
</书>
<书>
<书名>从入门到删除</书名>
<作者>lisi</作者>
<售价>0.9</售价>
</书>
</书架>