特殊文件

(框架源码用的多)

主要从三个方面学习

  • 了解它们的特点、作用
  • 学习使用程序读取它们里面的数据
  • 学习使用程序把数据存储到这些文件里

properties属性文件

XML文件

都是放置键值对信息

二者对比,XML存储多个对象的信息非常方便,适合存储更加复杂的数据关系

properties属性文件

1. 特点、作用

都只能是键值对,键不能重复,文件后缀是.properties。用来存数据

2. 如何使用程序读取文件中的数据

2.1 第一种方法

自己写IO流代码来读取并解析(非常麻烦繁琐)

2.2 第二种方法

Properties对象

  • 是一个Map集合(键值对集合),但是我们一般不会当集合使用
  • 核心作用:Properties是用来代表属性文件的,通过Properties可以读写属性文件里的内容
构造器 说明
public Properties() 用于构建Properties集合对象(空容器)
常用方法 说明
public void load(InputStream is) 通过字节输入流,读取属性文件里的键值对数据
public void load(Reader reader) 通过字符输入流,读取属性文件里的键值对数据
public String getProperty(String key) 根据键获取值(其实就是get方法的效果)
public Set <String>stringPropertyNames() 获取全部键的集合(其实就是keySet方法的效果)

代码实现

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
package com.ithzd.properties;

import java.io.FileReader;
import java.util.Properties;
import java.util.Set;

public class PrepertiesDemo1 {
   public static void main(String[] args) throws Exception{
       //1. 创建一个properties对象(键值对集合,空容器)
       Properties properties = new Properties();

       //2. 加载属性文件中的键值对数据到properties对象中去
       properties.load(new FileReader("resources\\bean.properties"));
       System.out.println(properties);

       //3. 根据键取值
       System.out.println(properties.getProperty("american"));
       System.out.println(properties.getProperty("latte"));

       //4. 遍历全部的键和值
       //4.1 for遍历
       Set<String> keys = properties.stringPropertyNames();
       for (String key : keys) {
           String value = properties.getProperty(key);
           System.out.println(key + "------>" + value);
      }
       //4.2 Lambda表达式遍历
       properties.forEach((k,v)-> System.out.println(k+"------>"+v));
  }
}

3. 如何将数据存储进文件

常用方法 说明
public Object setPropenty(String key,String value) 保存键值对数据到Properties对象中去
public void store(OutputStream os,String comments) 把键值对数据,通过字节输出流写出到属性文件里去
public void store(Write w,String comments) 把键值对数据,通过字符输出流写出到属性文件里去

XML文件

了解XML文件的特点和作用

学习使用程序读取它里面的数据

把数据写到XML文件中去(开发中很少用)

XML文件概述

XML是可扩展标记语言,意思是它是由一些标签组成的,而这些标签是自己定义的。本质上一种数据格式,可以用来表示复杂的数据关系。

1. XML的特点

  • XML中的”<标签名>”称为一个标签或一个元素,一般是成对出现的
  • XML中的标签名可以自己定义(可扩展),但必须要正确的嵌套
  • XML中只能有一个根标签
  • XML中的标签可以有属性
  • 如果一个文件中放置的是XML格式的数据,这个文件就是XML文件,后缀一般要写成.xml

2. XML语法规则

  • XML文件的后缀名是.xml,文档声明必须是第一行
    1
    2
    3
    4
    5
    <?xml version="1.0" encoding="UTF-8" ?>
    <!-- 注释:以上抬头声明必须放在第一行,必须有 -->
    version:XML默认的版本号码,该属性是必须存在的
    encoding:本XML文件的编码
    <!-- 根标签只能有一个 -->
  • **XML中像 **<,>,&等这些符号不能出现在标签的文本中,因为标签格式本身就有<>,会和标签格式冲突。
    • 如果标签文本中有这些特殊字符,需要用一些占位符代替。
      1
      2
      3
      4
      5
      <   表示  <  小于
      >   表示 > 大于
      & 表示 & 和
      ' 表示 ' 单引号
      " 表示 " 双引号
  • XML中可以写一个叫CDATA的数据区:<![CDATA[ 内容 ]]>,里面随便写
    • 如果在标签文本中,出现大量的特殊字符,不想使用特殊字符,此时可以用CDATA区,格式如下
      1
      2
      3
      4
      5
      <data1>
         <![CDATA[
        3 < 2 && 5 > 4
         ]]>
      </data1>

3. XML文件的作用:

常用来做配置文件(比如动态sql),偶尔用来传输(传输基本都是json了)

XML解析

  1. IO流
  2. Dom4j框架(第三方开源框架)
    导入Dom4j框架jar包步骤:
    • 先到官网下载
    • 然后放到lib目录下,右键点击添加到库(Add as Library)(手动)

DOM4J解析XML文件的思想是:文档对象模型(意思是把整个XML文档、每一个标签、每一个属性都等都当做对象来看待)。

  • Document对象表示整个XML文档
  • Element对象表示标签(元素)
  • Attribute对象表示属性
  • 标签中的内容就是文本
XML文件
SAXReader解析器
Document:整个文档
Element:元素<标签>
Attribute:属性
子元素,文本
  • SAXReader:Dom4j提供的解析器,可以认为是代表整个Dom4j框架
构造器/方法 说明
public SAXReader() 构建Dom4j的解析器对象
public Document read(String url) 把XML文件读成Document对象
public Document read(InputStream is) 通过字节输入流读取XML文件
  • Document
方法名 说明
Element getRootElement() 获得根元素对象
  • 用根元素在获取到它里面的子元素(包括子标签、表属性等)
方法名 说明
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() 得到文本
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
public class Dom4JTest1 {
   public static void main(String[] args) throws Exception {
       // 1、创建一个Dom4J框架提供的解析器对象
       SAXReader saxReader = new SAXReader();

       // 2、使用saxReader对象把需要解析的XML文件读成一个Document对象。
       Document document =
               saxReader.read("src/main/resoutces/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()); // 取出文本去除前后空格
  }
}