JAVA中properties、xml文件的读写操作

一、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 &lt; 2 &amp;&amp; 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 &lt; 2 &amp;&amp; 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</售价>
    </>
</书架>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LogicArk

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值