一. 属性文件.properties
1. #注释
2. 内容都是一些键值对信息,每行都是一个键值对;键不能重复;
3. 属性文件的后缀一般都是properties结尾
4. 使用程序读取properties属性文件里面的数据
(1) Properties:是一个Map集合(键值对集合),我们一般不会当做集合使用。
(2) Properties是用来代表属性文件的,通过Properties可以读写属性文件里的内容。
构造器 | 说明 |
public Properties() | 用于构建Properties集合对象(空容器) |
常用方法 | 说明 |
public void load(InputStream is) | 通过字节输入流,读取属性文件里的键值对数据 |
public void load(Reader reader) | 通过字符输入流,读取属性文件里的键值对数据 |
public String getProperty(String key) | 根据键获取值 |
public Set<String> stringPropertyNames() | 获取全部键的集合 |
#users.properties
# 用户名和密码
admin=159357
kasha=asdfghjkl
taitan=poiuytrewq
public static void main(String[] args) {
//public Properties() 用于构建Properties集合对象(空容器)
Properties prop = new Properties();
try (
Reader reader = new FileReader("wenjian_04\\src\\com\\wyyzs\\day01\\users.properties");
){
//public void load(InputStream is) 通过字节输入流,读取属性文件里的键值对数据
//public void load(Reader reader) 通过字符输入流,读取属性文件里的键值对数据
prop.load(reader);
//public String getProperty(String key) 根据键获取值
String name = prop.getProperty("admin");
System.out.println(name);
//public Set<String> stringPropertyNames() 获取全部键的集合
Set<String> set = prop.stringPropertyNames();
for(String key : set){
System.out.println(key + "=" + prop.getProperty(key));
}
prop.forEach((k, v) -> System.out.println(k + "=" + v));
} catch (Exception e) {
e.printStackTrace();
}
}
5. 使用程序把数据存储到properties属性文件里
(1) Properties:是一个Map集合(键值对集合),我们一般不会当做集合使用。
(2) Properties是用来代表属性文件的,通过Properties可以读写属性文件里的内容。
构造器 | 说明 |
public Properties() | 用于构建Properties集合对象(空容器) |
常用方法 | 说明 |
public Object setProperty(String key, String value) | 保存键值对数据到Properties对象中 |
public void store(OutputStream os. String comments) | 把键值对数据,通过字节输出流写到属性文件中,comments为注释信息 |
public void sotre(Writer w, String comments) | 把键值对数据,通过字符输出流写到属性文件中,comments为注释信息 |
public static void main(String[] args) throws IOException {
//使用程序把数据存储到properties属性文件里
//public Properties() 用于构建Properties集合对象(空容器)
//public Object setProperty(String key, String value) 保存键值对数据到Properties对象中
Properties prop = new Properties();
prop.setProperty("卡莎", "1526");
prop.setProperty("泰坦", "8521");
prop.setProperty("伊泽", "9654");
prop.setProperty("璐璐", "1547");
//public void store(OutputStream os. String comments) 把键值对数据,通过字节输出流写到属性文件中 comments为注释信息
//public void sotre(Writer w, String comments) 把键值对数据,通过字符输出流写到属性文件中 comments为注释信息
Writer writer = new FileWriter("wenjian_04\\src\\com\\wyyzs\\day01\\users2.properties");//文件自动生成
prop.store(writer, "用户名密码");
}
二. XML文件
1. XML(全称EXtensible Markup Language, 可扩展标记语言);本质是一种数据格式们可以用来存储复杂的数据结构和数据关系。经常用来作为系统的配置文件;或者作为一种特殊的数据结构,在网络中传输
2. XML中的”<标签名>“称为一个标签或一个元素,一般是成对出现的。
3. XML中的标签名是可以自己定义的(可扩展),但必须正确的嵌套
4. XML中只能有一个根标签
5. XML中的标签可以有属性
6. XML文件的创建
7. XML的语法规则
(1) XML文件的后缀名为:.xml,文档声明必须是第一行;version 是XML默认的版本号 该属性必须存在 encoding是该xml文件的编码
(2) XML中可以定义注释信息 :<!--注释内容-->
(3) XML中书写“<”、“&”等符号,可能会出现冲突导致报错,可以使用以下特殊字符替代
< | <小于号 |
> | >大于号 |
& | &和号 |
' | ‘单引号 |
" | ''引号 |
(4) XML中可以写一个叫CDATA的数据区:<![CDATA[...内容...]]>,里面内容可以随便写
<?xml version="1.0" encoding="UTF-8" ?>
<!-- 第一行必须放 xml声明 -->
<!-- 根标签只能有一个 -->
<users>
<user id = "1">
<name>卡莎</name>
<sex>女</sex>
<age>18</age>
<data>2 < 3 && 5 > 4</data>
<data1>
<![CDATA[
3 < 2 && 5 > 4
]]>
</data1>
</user>
<user id = "2">
<name>泰坦</name>
<sex>男</sex>
<age>17</age>
<data>2 < 3 && 5 > 4</data>
<data1>
<![CDATA[
3 < 2 && 5 > 4
]]>
</data1>
</user>
</users>
8. 解析XML文件:Dom4j(第三方框架)
(1) 程序员并不需要自己写原始的IO流来解析XML文件,难度较大,过程繁琐!可以使用解析XML的框架:最知名的是:Dom4j(第三方框架)
9. 使用程序解析XML文件
Dom4j解析XML-得到Document对象
(1) SAXReader:Dom4j提供的解析器,可以认为是代表整个Dom4j框架
构造器 | 说明 |
public SAXReader() | 构建Dom4j的解析器对象 |
public Document read(String url) | 把XML文件读成Document对象 |
public Document read(InputStream is ) | 通过字节输入流读取XML文件 |
(2) Document
方法名 | 说明 |
Element getRootElenent() | 获取根元素对象 |
方法名 | 说明 |
public String getName() | 获取元素名字 |
public List<Element> elements() | 获取当前元素下的所有一级子元素 |
public List<Element> elements(String name) | 获取当前元素下指定名字的子元素返回集合 |
public Element element(String name) | 获取当前元素下指定名字的子元素,如果存在多个名字相同的返回第一个 |
public String attributeValue(String name) | 通过属性名得到属性值 |
public String elementText(子元素名) | 获取指定名称的子元素文本 |
public String getText() | 得到文本 |
public static void main(String[] args) throws Exception {
//解析xml文件
//public SAXReader() 构建Dom4j的解析器对象
SAXReader saxReader = new SAXReader();
//public Document read(String url) 把XML文件读成Document对象
//public Document read(InputStream is ) 通过字节输入流读取XML文件
Document document = saxReader.read("wenjian_04\\src\\com\\wyyzs\\day01\\qwe.xml");
//Eleement getRootElenent() 获取根元素对象
Element root = document.getRootElement();
//public String getName() 获取元素名字
System.out.println(root.getName());//users
//public List<Element> elements() 获取当前元素下的所有一级子元素
List<Element> list = root.elements();
for (Element e : list) {
System.out.println(e.getName());//user qrt user
}
//public List<Element> elements(String name) 获取当前元素下指定名字的子元素返回集合
List<Element> list1 = root.elements("user");
for (Element e : list1) {
System.out.println(e.getName());//user user
}
//public Element element(String name) 获取当前元素下指定名字的子元素,如果存在多个名字相同的返回第一个
Element element = root.element("qrt");
System.out.println(element.getName());//qrt
//如果存在多个名字相同的返回第一个
Element user1 = root.element("user");
System.out.println(user1.elementText("name"));//卡莎
//public String attributeValue(String name) 通过属性名得到属性值
String attributeValue = user1.attributeValue("id");
System.out.println(attributeValue);//1
Attribute attribute = user1.attribute("id");
System.out.println(attribute.getName());//id
System.out.println(attribute.getValue());//1
//获取所有属性
List<Attribute> list2 = user1.attributes();
for (Attribute a : list2) {
System.out.println(a.getName() + "-->" + a.getValue());//id-->1 desc-->one
}
//public String elementText(子元素名) 获取指定名称的子元素文本
System.out.println(user1.elementText("name"));//卡莎
System.out.println(user1.elementText("sex"));//女
System.out.println(user1.elementText("age"));//18
System.out.println(user1.elementText("data"));//2 < 3 && 5 > 4
System.out.println(user1.elementText("data1"));//3 < 2 && 5 > 4
//public String getText() 得到文本
Element data = user1.element("data");
System.out.println(data.getText());//2 < 3 && 5 > 4
System.out.println(data.getTextTrim());//2 < 3 && 5 > 4 去除空格
}
10. XML的生成、约束
(1) 如何使用程序把数据写的XML文件中--不建议使用dom4j,推荐直接把程序里的数据拼接成XML格式、然后用IO流写出去。
public static void main(String[] args) {
//生成xml文件
//使用StringBuilder对象来拼接XML的格式
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\r\n");
stringBuilder.append("<root>\r\n");
stringBuilder.append("\t<name>").append("卡莎").append("</name>\r\n");
stringBuilder.append("\t<age>20</age>\r\n");
stringBuilder.append("\t<sex>").append("女").append("</sex>\r\n");
stringBuilder.append("</root>");
try (
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("wenjian_04\\src\\com\\wyyzs\\day01\\root.xml"));
){
bufferedWriter.write(stringBuilder.toString());
} catch (Exception e) {
e.printStackTrace();
}
}
(2) 约束XML文件的书写:就是限制XML文件只能按照某种格式进行编写。
(3) 约束文档:专门用来限制xml书写格式的文档,比如:限制标签、属性应该怎么写;约束文档的分类:
① DTD文档:不能约束具体的数据类型
a. 编写DTD约束文档,后缀必须是.dtd
b. 在需要编写的xml文件中导入该DTD约束文档
c. 然后xml文件就必须按照DTD约束文档指定的格式进行编写,否则报错
//root.xml内容
<!ELEMENT roots (root+)>
<!ELEMENT root (name, age, sex, password)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!ELEMENT password (#PCDATA)>
//xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE roots SYSTEM "root.dtd">
<roots>
<root>
<name>卡莎</name>
<age>20</age>
<sex>女</sex>
<password>74125852</password>
</root>
</roots>
② Schema文档:能约束具体的数据类型
a. 编写schema约束文档,后缀必须是.xds
b. 在需要编写的xml文件中导入该schema约束文档
c. 按照约束内容编写XML文件中标签
//xsd文档
<?xml version="1.0" encoding="UTF-8" ?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="D:\JavaCode\wenjian_04\src\com\wyyzs\day01\xml\"
elementFormDefault="qualified" >
<!-- targetNamespace:中约束文档的地址(命名空间) -->
<element name="roots">
<!-- 子元素 -->
<complexType>
<!-- maxOccurs="unbounded" roots下的子元素可以有任意多个 -->
<sequence maxOccurs="unbounded">
<element name="root">
<complexType>
<sequence>
<element name = "name" type="string" />
<element name = "age" type="string" />
<element name = "sex" type="string" />
<element name = "password" type="string" />
</sequence>
</complexType>
</element>
</sequence>
</complexType>
</element>
</schema>
// xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<roots xmlns = "D:\JavaCode\wenjian_04\src\com\wyyzs\day01\xml\"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "D:\JavaCode\wenjian_04\src\com\wyyzs\day01\xml root1.xsd">
<!-- xmlns = "D:\JavaCode" 基本位置
xsi:schemaLocation D:\JavaCode\wenjian_04\src\com\wyyzs\day01\xml root1.xsd-->
<root>
<name>卡莎</name>
<age>20</age>
<sex>女</sex>
<password>74125852</password>
<!-- <ss></ss> 格式不对会报错-->
</root>
</roots>