十五、特殊文件
类型
普通文件.txt——内容随便写,格式随意!
属性文件.properties——每行都是一个键值对
XML文件.xml——开始标签和结束标签组成,其中
原因
普通文件不好区分用户之间的信息;属性文件存储用户名和密码比较方便,再多存几个用户属性不太够用;XML文件可以存储用户的多个属性
作用
存储有关系的数据,作为系统的配置文件;作为信息进行传输
日志技术
把程序运行信息记录到文件,方便查看运行信息、debug
1. Properties属性文件
特点:
- 存储的是键值对
- 键不能重复
- 一般以.properties为后缀
作用:
- 记录用户名和信息
读文件
public class PropertiesTest1 {
public static void main(String[] args) throws Exception {
// 1. 创建一个Properties对象
Properties properties = new Properties();
System.out.println(properties);
// 2. 开始加载属性文件中的键值对数据到properties对象中去
properties.load(new FileReader("properties\\src\\users.properties"));
System.out.println(properties);
// 3. 取某个键对应的值
System.out.println(properties.getProperty("张三"));
// 4. 遍历全部的键和值
Set<String> keys = properties.stringPropertyNames();
for (String key : keys) {
System.out.println(key + ": " + properties.getProperty(key));
}
// Lambda遍历
properties.forEach((k, v) -> {
System.out.println(k + "--->" + v);
});
}
}
写文件
public class PropertiesTest2 {
public static void main(String[] args) throws Exception {
// 1. 创建一个Properties对象
Properties properties = new Properties();
System.out.println(properties);
// 2. 用这个对象存储一些键值对数据
properties.setProperty("张张", "123");
properties.setProperty("周周", "456");
properties.setProperty("赵赵", "789");
// 3. 存入文件
properties.store(new FileWriter("properties\\src\\users2.properties"), "users and password");
}
}
2. XML文件
EXtensible Markup Language, 可扩展标记语言
本质是一种数据结构,可以用来存储复杂的数据结构和数据关系
特点:
-
<标签名>称为标签或元素,一般是承兑出现
-
可以自己定义(可扩展),必须正确嵌套
-
只能有一个根标签
-
标签可以有属性,由键和值组成
-
内容是XML格式就成为XML文件,后缀是.xml
-
例:
<?xml version="1.0" encoding="UTF-8" ?> <!--以上抬头声明必须有且放在第一行--> <!--根标签只能有一个--> <users> <user id="1"> <name>张无忌</name> <sex>男</sex> <地址>光明顶</地址> <password>12344</password> <!--< <--> <!--> >--> <!--& &--> <!--' '--> <!--" "--> <定义> 2 >= 3 </定义> <data> <!--输入CD后,IDE可以补全,在这个CDATA数据区里面,内容可以随便写--> <![CDATA[ 1 < 3 ]]> </data> </user> </users>
作用:数据结构,存储复杂的数据结构和数据关系
应用场景:系统的配置文件;在网络中进行传输
2.1 解析XML文件——读取
自己写原始的IO流代码来解析XML,难度较大,也很繁琐———开源好用的解析XML框架,Dom4j(第三方研发的)
思想:文档对象模型
读取
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.util.List;
public class Dom4jTest1 {
public static void main(String[] args) throws Exception {
// 1. 创建一个Dom4J的解析器对象
SAXReader saxReader = new SAXReader();
// 2. 使用sexReader对象的read()方法,将文件解析成document对象
Document document = saxReader.read("properties\\src\\helloworld.xml");
// 3. 从文档对象中解析XML文件的全部数据
Element root = document.getRootElement();
System.out.println(root.getName()); // users
// Element中提供的解析具体数据的方法
// 注意:自上而下的解析方式
// 4. 获取根元素下的全部一级子元素
List<Element> elements = root.elements(); // 可以加子元素,分组相当于
for (Element element : elements) {
System.out.println(element.getName()); // user
}
// 5. 获取当前元素下的某个子元素
Element people = root.element("people");
System.out.println(people.getText());
// 如果下面有很多子元素,默认获取第一个
Element user = root.element("user");
System.out.println(user.element("name").getText()); //张无忌
System.out.println(user.elementText("name")); //张无忌
// 获取元素的属性信息
System.out.println(user.attributeValue("id"));
// 7. 如何获取全部的文本内容:获取当前元素下的子元素文本值
System.out.println(user.elementTextTrim("name")); // 取出文本去除空格
System.out.println(user.elementText("地址"));
System.out.println(user.elementText("password"));
}
}
写出:不建议用dom4j做
直接把程序里的数据拼接成XML格式,然后用IO流写出去