java特殊文件 属性文件properties和XML文件

news2024/12/23 0:05:13

属性文件properties

后缀为.properties的文件,称之为属性文件,它可以很方便的存储一些类似于键值对的数据。经常当做软件的配置文件使用。
首先我们要掌握属性文件的格式:

1.属性文件后缀以.properties结尾
2.属性文件里面的每一行都是一个键值对,键和值中间用=隔开。比如: admin=123456
3.#表示这样是注释信息,是用来解释这一行配置是什么意思。
4.每一行末尾不要习惯性加分号,以及空格等字符;不然会把分号,空格会当做值的一部分。
5.键不能重复,值可以重复

请添加图片描述

那么如何读取.properties文件呢?需要使用到Properties类,Properties是Map接口下面的一个实现类,所以Properties也是一种双列集合,用来存储键值对。 但是一般不会把它当做集合来使用。Properties类的对象,用来表示属性文件,可以用来读取属性文件中的键值对。需要用到的方法如下。

请添加图片描述

Properties读取属性文件的步骤如下:

1、创建一个Properties的对象出来(键值对集合,空容器)
2、调用load(字符输入流/字节输入流)方法(哪个都行,读文本还是建议用前者),开始加载属性文件中的键值对数据到properties对象中去
3、调用getProperty(键)方法,根据键取值

注意这里管道资源不需要我们手动关闭,api内部自动关
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-xml-log-app\\src\\users.properties"));
        System.out.println(properties);//输出{admin=123456,...}

        // 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);
        });
    }
}

使用Properties往属性文件中写键值对,需要用到的方法如下

请添加图片描述

往Properties属性文件中写键值对的步骤如下

1、创建Properties对象出来,
2、调用setProperty存储一些键值对数据
3、调用store(字符输出流/字节输出流, 注释),将Properties集合中的键和值写到文件中
	注意:第二个参数是注释,必须得加;
注意这里管道资源不需要我们手动关闭,api内部自动关

先准备一个users2.properties属性文件看看会不会被修改,如下图所示

请添加图片描述
运行下面代码:

public class PropertiesTest2 {
    public static void main(String[] args) throws Exception {
        // 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!");

    }
}

运行后user2.properties 配置文件打开效果如下图所示。

请添加图片描述

PS:测试发现把路径后缀改成txt文件一样能运行,包括读文件键值对和写文件键值对。



XML文件

xml文件是一种在开发中经常使用的文件,是可扩展的标记语言,意思是它是由一些标签组成的,而这些标签是自己定义的。本质上是一种数据格式,可以用来表示复杂的数据关系。

请添加图片描述

XML文件有如下的特点:

XML中的<标签名> 称为一个标签或者一个元素,一般是成对出现的。
XML中的标签名可以自己定义(可扩展),但是必须要正确的嵌套
XML中只能有一个根标签。
XML标准中可以有属性
XML必须第一行有一个文档声明,格式是固定的<?xml version="1.0" encoding="UTF-8"?>
XML文件必须是以.xml为后缀结尾

如下图所示,是最为常见的,标签有属性、文本、还有合理的嵌套。请添加图片描述

XML文件中除了写以上的数据格式之外,还有一些特殊的字符不能直接写。像 <,>,&等这些符号不能出现在标签的文本中,因为标签格式本身就有<>,会和标签格式冲突。

<data> 3 < 2 && 5 > 4 </data>
<!--  错误写法 -->

如果标签文本中有这些特殊字符,需要用一些占位符代替。

&lt;  表示 <
&gt;  表示 >
&amp; 表示 &
&apos; 表示 '
&quot; 表示 "

如果在标签文本中,出现大量的特殊字符,不想使用特殊字符,此时可以用CDATA区,格式如下

<data1>
    <![CDATA[
   		3 < 2 && 5 > 4
    ]]>
</data1>

XML解析1 获取根元素
使用程序读取XML文件中的数据,称之为XML解析。这里并不需要我们自己写IO流代码去读取xml文件中的数据。其实有很多开源的,好用的XML解析框架,最知名的是DOM4J(第三方开发的,在官网下载jar包)。DOM4J解析XML文件的思想是:文档对象模型(意思是把整个XML文档、每一个标签、每一个属性等都当做对象来看待)。Document对象表示整个XML文档、Element对象表示标签(元素)、Attribute对象表示属性、标签中的内容就是文本。

请添加图片描述

请添加图片描述

DOM4J解析XML需要用到的方法如下图所示

请添加图片描述

XML解析的过程,是从根元素开始,从外层往里层解析。 我们先把Document对象,和根元素获取出来

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("properties-xml-log-app\\src\\helloworld.xml");

        // 3、从文档对象中解析XML文件的全部数据了
        Element root = document.getRootElement();
        System.out.println(root.getName());//输出users
    }
}

XML解析2 获取子元素
获取到XML文件的根元素之后,接下来,就可以用根元素在获取到它里面的子元素(包括子标签、表属性等)。需要用到的方法如下图所示

请添加图片描述
把上面的方法对下面的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>
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("properties-xml-log-app\\src\\helloworld.xml");

        // 3、从文档对象中解析XML文件的全部数据了
        Element root = document.getRootElement();
        System.out.println(root.getName());//users

        // 4、获取根元素下的全部一级子元素。
        // List<Element> elements = root.elements();
         // 4、获取根元素下的全部名为user的元素。
        List<Element> elements = root.elements("user");
        for (Element element : elements) {
            System.out.println(element.getName());//user
        }

        // 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"));//1
        Attribute id = user.attribute("id");
        System.out.println(id.getName());//id
        System.out.println(id.getValue());//1

        List<Attribute> attributes = user.attributes();//获取user的全部属性
        for (Attribute attribute : attributes) {
            System.out.println(attribute.getName() + "=" + attribute.getValue());
            //id=1 desc=第一个用户
        }

        // 7、如何获取全部的文本内容:获取当前元素下的子元素文本值
        System.out.println(user.elementText("name"));//张无忌
        System.out.println(user.elementText("地址"));//光明顶
        System.out.println(user.elementTextTrim("地址")); // 取出文本去除前后空格
        System.out.println(user.elementText("password"));//minmin

        Element data = user.element("data");
        System.out.println(data.getText());// 3 < 2 && 5 > 4
        System.out.println(data.getTextTrim()); // 取出文本去除前后空格
    }
}

XML文件写入
DOM4J也提供了往XML文件中写标签的方法,但是用起来比较麻烦。这里不建议使用
我们自己使用StringBuilder按照标签的格式拼接,然后再使用BufferedWriter写到XML文件中去就可以了。

public class Dom4JTest2 {
    public static void main(String[] args) {
        // 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("dlei").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();
        }

    }
}
<?xml version="1.0" encoding="UTF-8" ?>
<book>
	<name>从入门到跑路</name>
	<author>dlei</author>
	<price>999.99</price>
</book>

XML约束(了解)
XML约束指的是限制XML文件中的标签或者属性,只能按照规定的格式写。
比如我在项目中,想约束一个XML文件中的标签只能写<书>、<书名>、<作者>、<售价>这几个标签,如果写其他标签就报错。
怎么才能达到上面的效果呢?有两种约束技术,一种是DTD约束、一种是Schame约束。
如下图所示book.xml中引入了DTD约束文件,book.xml文件中的标签就受到DTD文件的约束

请添加图片描述

<!ELEMENT 书架(书+)>   表示根标签是<书架>,并且书架中有子标签<书>
<!ELEMENT 书(书名、作者、售价)> 表示书是一个标签,且书中有子标签<书名>、<作者>、<售价>
<!ELEMENT 书名(#PCDATA)>	表示<书名>是一个标签,且<书名>里面是普通文本
<!ELEMENT 作者(#PCDATA)>	表示<作者>是一个标签,且<作者>里面是普通文本
<!ELEMENT 售价(#PCDATA)>	表示<售价>是一个标签,且<售价>里面是普通文本

Schame约束案例
如下图所示,左边的book2.xml文件就受到右边schame文件(.xsd结尾的文件)的约束。

请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/989933.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python Opencv实践 - Shi-Tomasi角点检测

参考资料&#xff1a;Harris和Shi-tomasi角点检测笔记&#xff08;详细推导&#xff09;_harris焦点检测_亦枫Leonlew的博客-CSDN博客 cv.goodFeaturesToTrack&#xff1a;Shi-Tomasi角点检测-OpenCV-python_独憩的博客-CSDN博客 import cv2 as cv import numpy as np import …

精准定位,智慧港口:北斗技术在港口车辆智能监管中的应用

随着全球经济一体化的加速推进&#xff0c;港口作为全球物流网络中的关键节点、对外贸易货物的集散中心以及国际物流供应链的重要组成部分&#xff0c;其在区域经济发展中的作用变得越来越重要。然而&#xff0c;随着港口向大型化、专业化方向的发展&#xff0c;现有的基础设施…

基于Java+SpringBoot+UniApp的微信小程序朋友圈

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 随着社交媒体的兴起和…

在UE4虚幻引擎中加入导航网格体边界体积后丧尸不能移动和发现玩家

UE4系列文章目录 文章目录 UE4系列文章目录前言一、用到的知识点二、问题原因 前言 最近使用ue4做第一人称视角射击游戏发现问题&#xff0c;加入导航网格体边界体积后丧尸不能移动和发现玩家。下图是出现的问题图片 一、用到的知识点 1.行为树&#xff1a;控制并显示AI的决…

【后端面经-数据库】Redis数据结构和底层数据类型

【后端面经-数据库】Redis数据结构和底层数据类型 1. Redis数据类型1.1 基本数据类型1. string2. hash3. list4. set5. sortset/Zset 1.2 特殊数据类型1. bitmap2. hyperloglog3. GEO4. stream 2. Redis底层数据类型2.1 简介2.2 动态字符串SDS2.3 快表QuickList2.4 字典Dict2.5…

论文解读 | 基于中心的三维对象检测与跟踪

原创 | 文 BFT机器人 CenterPoint与传统基于框的3D物体检测器和跟踪器不同之处在于&#xff0c;它将3D物体表示、检测和跟踪为点&#xff0c;而不是使用边界框。这种方法具有几个优点&#xff0c;包括减少物体检测器的搜索空间&#xff0c;简化下游任务&#xff08;如跟踪&…

一键去除文件名中的空格,轻松解决文件命名烦恼!

你是否曾经为文件名中的空格而烦恼&#xff1f;这些空格可能会在传输、存储和搜索文件时带来各种问题。为了解决这个问题&#xff0c;本文将向你介绍几种实用的方法&#xff0c;让你轻松去除文件名中的空格&#xff0c;让文件命名变得更加简单&#xff01; 首先&#xff0c;我…

MAC终端美化

先看看效果&#xff1a; 1.安装on-my-zsh 打开终端&#xff0c;输出&#xff1a; sh -c "$(curl -fsSL https://gitee.com/mirrors/oh-my-zsh/raw/master/tools/install.sh)"安装过程中如果出现了链接超时的错误&#xff0c;不要慌&#xff0c;就再来一次&#x…

牛客网——BM62 斐波那契数列

class Solution { public:/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规定的值即可** * param n int整型 * return int整型*/int Fibonacci(int n) {// write code hereif(n0) //考虑第0项return 0;else if(n1||n2)return 1;else…

人大加拿大女王大学金融硕士项目——自律是实现目标和成功的桥梁

低级的欲望通过放纵就能得到&#xff0c;高级的欲望通过自律才能得到。在这个快速发展的时代&#xff0c;只有保持自律&#xff0c;不断的充实自己&#xff0c;提升自己&#xff0c;才不会被社会所淘汰。中国人民大学与加拿大女王大学金融硕士项目&#xff0c;汇集了金融业的精…

EPICS asyn诊断帮助

iocsh命令 asynReport(level,portName) asynInterposeFlushConfig(portName,addr,timeout) asynInterposeEosConfig(portName,addr,processIn,processOut) asynSetTraceMask(portName,addr,mask) asynSetTraceIOMask(portName,addr,mask) asynSetTraceInfoMask(portName,addr…

Greenplum执行SQL卡住的问题

问题 今天社区群里面一位同学反映他的SQL语句执行会hang住&#xff0c;执行截图如下。 分析 根据提示信息&#xff0c;判断可能是网络有问题&#xff0c;或者是跟GP使用UDP包有关系。 此同学找了网络检查的人确定网络没有问题&#xff0c;于是猜测跟UDP包有关。 参考文章ht…

合宙Air724UG LuatOS-Air LVGL API控件-窗口 (Window)

窗口 (Window) 分 享导出pdf 示例代码 win lvgl.win_create(lvgl.scr_act(), nil) lvgl.win_set_title(win, "Window title") -- close_btn lvgl.win_add_btn_right(win, "\xef\x80\x8d") -- --lvgl.obj_set_event_cb(cl…

企业架构LNMP学习笔记23

1、隐藏版本号&#xff1a; Nginx对外提供服务&#xff0c;为了避免被针对某个版本的漏洞进行攻击。经常做法是隐藏掉软件的版本信息&#xff0c;提供一定的安全性。 server_tokens off; https和CA&#xff1a; 1&#xff09;基于SSL CA证书的公私钥的安全性。 CA是需要生成…

pip安装skimage的方法

在安装skimage时&#xff0c;可能会报错误&#xff1a; 可以尝试&#xff1a;pip install scikit-image进行安装&#xff0c;使用时只需要&#xff1a;import skimage

Multisim14.0仿真(十)同相放大器

一、仿真原理图&#xff1a; 二、仿真效果图&#xff1a;

5.xaml RadioButton按钮

1.运行图 2.运行源码 a.Xaml源码 <Grid Name="Grid1"><!--GroupName="role" 设置组名,同一组名,他们是互斥--><RadioButton Content="管理员" GroupName

数据库作业练习题

数据库知识 1.不属于关系数据库的是&#xff08;B&#xff09; A.Oracle B.Essbase C.SQL Server D.DB2 Oracle和SQL Server属于关系数据库&#xff0c;DB2是个老古董了&#xff0c;看见DB也应该知道是数据库了&#xff0c;就剩下Essbase了&#xff0c;故选B。Essbase是一种多…

代码审查和合并请求:团队合作中的关键

在现代软件开发中&#xff0c;团队合作是不可或缺的一部分。为了确保代码质量、减少错误以及促进知识共享&#xff0c;代码审查和合并请求成为了开发团队中的关键实践。在本文中&#xff0c;我们将深入探讨代码审查和合并请求的重要性、流程以及最佳实践。 代码审查的重要性 …

2023-09-08 LeetCode每日一题(计算列车到站时间)

2023-09-08每日一题 一、题目编号 2651. 计算列车到站时间二、题目链接 点击跳转到题目位置 三、题目描述 给你一个正整数 arrivalTime 表示列车正点到站的时间&#xff08;单位&#xff1a;小时&#xff09;&#xff0c;另给你一个正整数 delayedTime 表示列车延误的小时…