23-properties文件和xml文件以及dom4j的基本使用操作
特殊文件
我们利用这些特殊文件来存放我们 java 中的数据信息,当数据量比较大的时候,我们可以利用这个文件对数据进行快速的赋值

对于多个用户数据的存储的时候我们要用这个XML来进行存储

关于这些特殊文件,我们主要学什么
- 了解他们的特点,作用
- 学习使用程序读取他们里面的数据
- 学习使用程序把数据存储到这些文件里
Properties属性文件
了解它们的特点、作用
学习使用程序读取它们里面的数据
学习使用程序把数据存储到这些文件里

是一个Map集合(键值对集合),但是我们一般不会当集合使用。
核心作用:Properties是用来代表属性文件的,通过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() | 获取全部键的集合(其实就是 ketSet 方法的效果) |
其实它本质作用就是我们用来读取文件中的等号两边的元素
其本质是一个map集合
文件内容,好像中文格式不兼容?
admin=123456
张无忌=minmin
sadf=wuji
asfdaf=wuji
public static void main(String[] args) throws IOException { // 创建这个特殊文件Properties pt = new Properties();System.out.println(pt); //输出为空pt.load(new FileReader("LearnJavaSE\\Learn\\src\\Metamorphosis\\day4\\SpecialFile\\p.properties"));System.out.println(pt);System.out.println(pt.getProperty("admin")); //根据键的值来读取数据.
写
| 常用方法 | 说明 |
|---|---|
| public Object setProperty(String key, String value) | 保存键值对数据到Properties对象中去。 |
| public void store(OutputStream os, String comments) | 把键值对数据,通过字节输出流写出到属性文件里去 |
| public void store(Writer w, String comments) | 把键值对数据,通过字符输出流写出到属性文件里去 |
| 属性文件并不是后缀是properties才是属性文件 | |
| 只要满足键值对的书写格式,那么 txt 也是属性文件 |
// 创建这个特殊文件Properties pt = new Properties();System.out.println(pt); // 输出为空pt.load(new FileReader("LearnJavaSE\\Learn\\src\\Metamorphosis\\day4\\SpecialFile\\test.txt"));System.out.println(pt);System.out.println(pt.getProperty("admin")); // 根据键的值来读取数据.
XML文件
本质是一种数据的格式,可以用来存储复杂的数据结构,和数据关系。
XML的特点
- XML中的“<标签名>” 称为一个标签或一个元素,一般是成对出现的。
- XML中的标签名可以自己定义(可扩展),但必须要正确的嵌套。
- XML中只能有一个根标签。
- XML中的标签可以有属性。
- 如果一个文件中放置的是XML格式的数据,这个文件就是XML文件,后缀一般要写成.xml。
和HTML文件,惊人的类似
XML的创建
就是创建一个 XML 类型的文件,要求文件的后缀必须使用 xml,如 hello_world.xml, 这一点和这个 properties 文件不太一样,properties 只需要内容的格式满足条件就可以了, 其他的要求不高的
开头文件的格式必须这样写,必须放在第一行
<?xml version="1.0" encoding="UTF-8" ?>version:XML默认的版本号码、该属性是必须存在的encoding:本XML文件的编码
XML文件中的特殊符号
XML 中可以定义注释信息: 这个和这个 html 文件是一样的.
XML中书写”<”、“&”等,可能会出现冲突,导致报错,此时可以用如下特殊字符替代。
` < < 小于> > 大于& & 和号' ' 单引号" " 引号
XML中可以写一个叫CDATA的数据区: <![CDATA[ …内容… ]]>,里面的内容可以随便写。**此时的小于号还有大于号就不用再用特殊符号了**
<?xml version="1.0" encoding="utf-8" ?>
<users><use id="1"><name>张无忌</name><sex>男</sex></use><use id="2"><name>任盈盈</name><sex>女</sex></use>
</users>
作用
本质是一种数据格式,可以存储复杂的数据结构,和数据关系。
应用场景:经常用来做为系统的配置文件;或者作为一种特殊的数据结构,在网络中进行传输。

XML文件的解析
注意:程序员并不需要自己写原始的IO流代码来解析XML,难度较大!也相当繁琐!
其实,有很多开源的,好用的,解析XML的框架,最知名的是:Dom4j(第三方研发的)

SAXReader:Dom4j 提供的解析器,可以认为是代表整个 Dom4j 框架
| 构造器/方法 | 说明 |
|---|---|
| public SAXReader() | 构建Dom4J的解析器对象 |
| public Document read(String url) | 把XML文件读成Document对象 |
| public Document read(InputStream is) | 通过字节输入流读取XML文件 |
| 使用方法 |
SAXReader sr = new SAXReader();
Document doc = sr.read("LearnJavaSE\\Learn\\src\\Metamorphosis\\day4\\SpecialFile\\xmlTest.xml");
Document doc2 = sr.read(new FileReader("LearnJavaSE\\Learn\\src\\Metamorphosis\\day4\\SpecialFile\\xmlTest.xml"));
| 方法名 | 说明 |
|---|---|
| Element getRootElement() | 获得根元素对象 |
| 获取根节点,根节点是这个 xml 分析的开始,任何 xml 分析工作都要从这个根开始 |
Element root = doc.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() | 得到文本 |
xml 的基本操作如下
<?xml version="1.0" encoding="utf-8" ?>
<users><use id="1"><name>张无忌</name><sex>男</sex></use><use id="2"><name>任盈盈</name><sex>女</sex></use>
</users>
// 我们首先要读取这个xml文件SAXReader sr = new SAXReader();Document doc = sr.read("LearnJavaSE\\Learn\\src\\Metamorphosis\\day4\\SpecialFile\\xmlTest.xml");// Document doc2 = sr.read(new// FileReader("LearnJavaSE\\Learn\\src\\Metamorphosis\\day4\\SpecialFile\\xmlTest.xml"));Element root = doc.getRootElement();System.out.println(root.getName()); // 根节点名称List<Element> elements = root.elements();for (Element elements2 : elements) {System.out.println(elements2.getName()); // 根节点下的节点名,只能是一层,第二层的节点名比如说这个name和sex是无法读取的//根据属性名来获取这个id对象的值System.out.println(elements2.attributeValue("id"));// 获取这个use类中的名称为name的所有子元素,并返回集合,然后可以读取这个text文本了List<Element> elements3 = elements2.elements("name");for (Element elements32 : elements3) {System.out.println(elements32.getText());}
得到当前元素下指定名字的子元素,如果有很多名字相同的返回第一个
Element people = rootElement.element("people");System.out.println(people.getText());
把程序中的数据写入到XML文件中
StringBuilder sb = new StringBuilder();sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\r\n");sb.append("<book>\r\n");sb.append("<name>").append("从入门到跑路").append("</name>\r\n");sb.append("<author>").append("dlei").append("</author>\r\n");sb.append("<name>").append("从入门到跑路").append("</name>\r\n");sb.append("</book>");BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("src/day5/newtest.xml"));bufferedWriter.write(sb.toString());bufferedWriter.close();
我们如果不用这个 dom4库来进行写,我们还可以通过这个 IO 流的读写方式来进行读写,但是没有必要,用别人封装好的就行,java 只需要 nb 就是因为这些别人封装好的库,这些库使得大多数的 java 操作变得简单了
约束XML文件的书写
顾名思义就是限制 XML 文件只能按照某种格式进行书写。
专门用来限制xml书写格式的文档,比如:限制标签、属性应该怎么写。
约束文档的分类
DTD文档
Schema文档
XML文档约束-DTD的使用(了解)
需求:利用DTD约束文档,约束一个XML文件的编写。
①:编写DTD约束文档,后缀必须是.dtd
<!ELEMENT 书架 (书+)>
<!ELEMENT 书 (书名,作者,售价)>
<!ELEMENT 书名 (#PCDATA)>
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 售价 (#PCDATA)>
可以约束XML文件的编写
不能约束具体的数据类型
②:在需要编写的XML文件中导入该DTD约束文档
③:然后XML文件,就必须按照DTD约束文档指定的格式进行编写,否则报错!
<!ELEMENT 书架 (书+)> //表示这个根元素是书架,然后根元素的子元素是书,+加号表示不止只有一个子元素
<!ELEMENT 书 (书名,作者,售价)>
<!ELEMENT 书名 (#PCDATA)> //子元素的子元素
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 售价 (#PCDATA)>
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE 书架 SYSTEM "data.dtd">
<书架><书><书名>从入门到删库</书名><作者>小猫</作者><售价>很便宜</售价></书><书><书名>从入门到删库</书名><作者>小猫</作者><售价>9.9</售价></书><书><书名>从入门到删库</书名><作者>小猫</作者><售价>9.9</售价></书>
</书架>
XML文档约束-schema的使用(了解)
可以约束XML文件的编写、和数据类型
需求:利用schema文档约束,约束一个XML文件的编写。
①:编写schema约束文档,后缀必须是.xsd,具体的形式到代码中观看。
②:在需要编写的XML文件中导入该schema约束文档
③:按照约束内容编写XML文件的标签。
<?xml version="1.0" encoding="UTF-8" ?>
//xmln后面的网址表示这个xsd文档本身也是受到别人约束的
<schema xmlns="http://www.w3.org/2001/XMLSchema"targetNamespace="http://www.itcast.cn" elementFormDefault="qualified" > //这个不用管,直接把这个复制到xsd文档开头就行了.<!-- 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>
<?xml version="1.0" encoding="UTF-8" ?>
<书架 xmlns="http://www.itcast.cn" //声明一个包名,和xsd的里面的那个targetNamespace中的内容一样xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.itcast.cn data.xsd"><!-- xmlns="http://www.itcast.cn" 基本位置xsi:schemaLocation="http://www.itcast.cn books02.xsd" 具体的位置 --><书><书名>从入门到删除</书名><作者>dlei</作者><售价>9.9</售价></书><书><书名>从入门到删除</书名><作者>dlei</作者><售价>0.9</售价></书>
</书架>
相关文章:
23-properties文件和xml文件以及dom4j的基本使用操作
特殊文件 我们利用这些特殊文件来存放我们 java 中的数据信息,当数据量比较大的时候,我们可以利用这个文件对数据进行快速的赋值 对于多个用户数据的存储的时候我们要用这个XML来进行存储 关于这些特殊文件,我们主要学什么 了解他们的特点&…...
新型信息基础设施IP追溯:保护隐私与网络安全的平衡
随着信息技术的飞速发展,新型信息基础设施在全球范围内日益普及,互联网已经成为我们社会和经济生活中不可或缺的一部分。然而,随着网络使用的增加,隐私和网络安全问题也引发了广泛关注。在这个背景下,IP(In…...
django 实现:闭包表—树状结构
闭包表—树状结构数据的数据库表设计 闭包表模型 闭包表(Closure Table)是一种通过空间换时间的模型,它是用一个专门的关系表(其实这也是我们推荐的归一化方式)来记录树上节点之间的层级关系以及距离。 场景 我们 …...
Redis与分布式-集群搭建
接上文 Redis与分布式-哨兵模式 1. 集群搭建 搭建简单的redis集群,创建6个配置,开启集群模式,将之前配置过的redis删除,重新复制6份 针对主节点redis 1,redis 2,redis 3都是以上修改内容,只是…...
C++--位图和布隆过滤器
1.什么是位图 所谓位图,就是用每一位来存放某种状态,适用于海量数据,数据无重复的场景。通常是用来判断某个数据存不存在的。比如int 有32位,就可以存放0到31这32个数字在不在某个文件中。当然,其他类型也可以。 2.位…...
linux常识
目录 i.mx6ull开发板配置ip 静态IP配置 命令行配置 配置文件配置 动态IP配置 命令行配置 配置文件配置 为什么编译驱动程序之前要先编译内核? init系统服务 systemv守护进程 systemd守护进程 i.mx6ull开发板配置ip i.mx6ull有两个网卡(eth0和…...
Codeforces Round 901 (Div. 1) B. Jellyfish and Math(思维题/bfs)
题目 t(t<1e5)组样例,每次给出a,b,c,d,m(0<a,b,c,d,m<2的30次方) 初始时,(x,y)(a,b),每次操作,你可以执行以下四种操作之一 ①xx&y,&为与 ②xx|y,|为或 ③yx^y,^为异或 …...
unity 鼠标标记 左键长按生成标记右键长按清除标记,对象转化为子物体
linerender的标记参考 unity linerenderer在Game窗口中任意画线_游戏内编辑linerender-CSDN博客 让生成的标记转化为ARMarks游戏对象的子物体 LineMark.cs using System.Collections; using System.Collections.Generic; using UnityEngine;public class LineMark : MonoBeh…...
解决mac pro 连接4k显示器严重发烫、卡顿问题
介绍个不用花钱的方法。其实mac自带的风扇散热能力还可以的,但是默认比较懒散,可以用一个软件来控制下,激发下它的潜能。 可以下个stats软件 打开传感器开关,以及同步控制风扇开关 以及cpu显示温度 点击控制台上的温度图标&…...
QT的ui设计中改变样式表的用法
在QT的ui设计中,我们右键会弹出一个改变样式表的选项,很多人不知道这个是干什么的。 首先我们来看下具体的界面 首先我们说一下这个功能具体是干嘛的, 我们在设置很多控件在界面上之后,常常都是使用系统默认的样式,但是当有些时候为了美化界面我们需要对一些控件进行美化…...
零基础Linux_10(进程)进程终止(main函数的返回值)+进程等待
目录 1. 进程终止 1.1 main函数的返回值 1.2 进程退出码和错误码 1.3 进程终止的常见方法 2. 进程等待 2.1 进程等待的原因 2.2 wait 函数 2.3 waitpid 函数 2.4 int* status参数 2.5 int options非阻塞等待 本篇完。 1. 进程终止 进程终止指的就是程序执行结束了&…...
【已解决】opencv 交叉编译 ffmpeg选项始终为NO
一、opencv 交叉编译没有 ffmpeg ,会导致视频打不开 在交叉编译时候,发现在 pc 端能用 opencv 打开的视频,但是在 rv1126 上打不开。在网上查了很久,原因可能是 交叉编译过程 ffmpeg 造成的。之前 ffmpeg 是直接用 apt 安装的&am…...
rust生命期
一、生命期是什么 生命期,又叫生存期,就是变量的有效期。 实例1 {let r;{let x 5;r &x;}println!("r: {}", r); }编译错误,原因是r所引用的值已经被释放。 上图中的绿色范围’a表示r的生命期,蓝色范围’b表示…...
实现将一张图片中的目标图片抠出来
要在python中实现将一张图片中的目标图片裁剪出来,需要用到图像处理及机器学习库,以下是一个常用的基本框架 加载图片并使用OpenCV库将其转换为灰度图像 import cv2img cv2.imread(screenshot.jpg) gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)准备模…...
Rust 使用Cargo
Rust 使用技巧 Rust 使用crates 假设你正在编写一个 Rust 程序,要使用一个名为 rand 的第三方库来生成随机数。首先,你需要在 Cargo.toml 文件中添加以下依赖项: toml [dependencies] rand "0.7.3" 然后运行 cargo build&…...
【k8s】集群搭建篇
文章目录 搭建kubernetes集群kubeadm初始化操作安装软件(master、所有node节点)Kubernetes Master初始化Kubernetes Node加入集群部署 CNI 网络插件测试 kubernetes 集群停止服务并删除原来的配置 二进制搭建(单master集群)初始化操作部署etcd集群安装Docker部署master节点解压…...
10.1select并发服务器以及客户端
服务器: #include<myhead.h>//do-while只是为了不让花括号单独存在,并不循环 #define ERR_MSG(msg) do{\fprintf(stderr,"%d:",__LINE__);\perror(msg);\ }while(0);#define PORT 8888//端口号1024-49151 #define IP "192.168.2.5…...
几个好用的测试HTTP请求的网站
Reqres (https://reqres.in):Reqres提供了一个模拟的REST API,您可以使用它来测试POST、GET、PUT等HTTP请求,并获得相应的响应结果。 JSONPlaceholder (https://jsonplaceholder.typicode.com):JSONPlaceholder是一个免费的JSON测…...
kafka简易搭建(windows环境)
1,下载 Apache Kafka 查找 kafka_2.13-3.2.1.tgz 2,java版本需要17以上 3,配置server.properties的log.dirs目录、zookeeper.properties 的dataDir目录 windows反斜杠地址 4,启动 cd D:\app\kafka_2.13-3.2.1 .\bin\window…...
毕业设计选题uniapp+springboot新闻资讯小程序源码 开题 lw 调试
💕💕作者:计算机源码社 💕💕个人简介:本人七年开发经验,擅长Java、Python、PHP、.NET、微信小程序、爬虫、大数据等,大家有这一块的问题可以一起交流! 💕&…...
基于MCP协议的Shopify数据AI分析:自动化广告优化实战指南
1. 项目概述:用AI打通Shopify数据与广告投放的任督二脉 如果你在运营一个Shopify独立站,并且正在为Google、Meta(Facebook/Instagram)或TikTok广告投放而头疼,那么你很可能正经历着所有电商卖家的共同困境:…...
好用的AI软件开发选哪家
在当今数字化飞速发展的时代,AI软件已经成为众多企业和个人提升效率、创新业务的重要工具。然而,面对市场上众多的AI软件开发公司,如何选择一家靠谱且好用的公司成为了许多人的困扰。今天,我就为大家推荐广州飞进信息科技有限公司…...
AI加速器架构对比:从GPU到专用芯片的性能与能效分析
1. AI加速器架构全景解析:从通用GPU到专用芯片的演进在深度学习计算领域,硬件架构的创新正以前所未有的速度推进。传统GPU凭借其强大的并行计算能力长期占据主导地位,但随着模型规模的指数级增长和能效要求的不断提高,各类专用AI加…...
构建个人代码知识库:codesift工具的设计理念与高效实践
1. 项目概述:从代码仓库到个人知识库的进化最近在整理自己过去几年写过的代码片段、工具脚本和项目配置时,发现了一个普遍存在的痛点:这些零散的“智慧结晶”散落在硬盘的各个角落、不同的Git仓库里,甚至有些只存在于模糊的记忆中…...
【Midjourney 2026审美趋势白皮书】:基于127万组V6–V7生成样本的AI视觉演化模型预测
更多请点击: https://intelliparadigm.com 第一章:Midjourney 2026审美趋势白皮书导论 人工智能图像生成正从“可用”迈向“可策展”阶段。Midjourney v6.5 及其预发布的 Beta-2026 引擎已展现出对文化语境、跨媒介质感与时间性美学的深层建模能力——这…...
为AI编码助手集成aislop-skill:实时代码质量检测与修复
1. 项目概述:为AI编码助手装上“质检员”如果你和我一样,日常重度依赖Cursor、Windsurf这类AI驱动的IDE,或者频繁使用Claude Code、Gemini CLI等代码生成工具,那你一定遇到过这样的场景:AI助手生成的代码,功…...
自动驾驶人机交接:DMS与安全验证如何破解控制权转移困局
1. 自动驾驶人机交接的核心困境与行业分野最近几年,自动驾驶(AV)和高级驾驶辅助系统(ADAS)无疑是汽车科技领域最炙手可热的话题。无论是传统车企的“新四化”转型,还是科技公司的颠覆性入局,大家…...
别再为EVE-ng镜像发愁了!手把手教你从官网下载到VMware部署(附国内加速地址)
EVE-ng网络模拟器全流程实战:从镜像获取到高阶配置 第一次接触网络设备模拟的工程师,往往会在EVE-ng的入门阶段遇到各种"拦路虎"——镜像文件找不到可靠的下载源、导入VMware时配置出错、虚拟网络连接异常。这些问题如果得不到解决,…...
视频字幕提取神器:如何让AI帮你自动转录硬字幕?
视频字幕提取神器:如何让AI帮你自动转录硬字幕? 【免费下载链接】video-subtitle-extractor 视频硬字幕提取,生成srt文件。无需申请第三方API,本地实现文本识别。基于深度学习的视频字幕提取框架,包含字幕区域检测、字…...
从SMP到NUMA:聊聊多核CPU时代Linux内存管理是怎么‘进化’的
从SMP到NUMA:多核CPU时代的内存管理演进之路 2000年代初,当单核CPU的主频竞赛逐渐触及物理极限时,计算机架构师们面临一个关键抉择:如何在芯片上堆叠更多晶体管?答案最终指向了多核设计。但随之而来的内存访问瓶颈&…...
