配置文件及其解析

2023-11-09

配置文件(properties,xml)

配置文件可以解决我们在编程中遇到的硬编码问题,那么什么是硬编码呢?
硬编码:将一些经常调用修改的数据代码直接写死在了java源代码程序中,就会产生硬编码问题。(一般情况下,通过配置文件来解决硬编码问题,在IDEA中,一般将配置文件放在resource文件之中)

resource文件夹的创建

在这里插入图片描述
在这里插入图片描述
此时,文件夹还不能用,还需进一步操作:

在这里插入图片描述
至此,resource文件夹创建成功,如下图,文件夹右下角会出现黄色的几道杠。
在这里插入图片描述

properties文件
文件特点
  1. 文件后缀名为(.properties)
  2. 对应的是java中Properties集合,(Map集合的实现类的一种)
  3. 存储方式为键值对的方式,并且默认为String类型(书写properties文件时,可以不用指定数据类型,也不用使用双引号)
  4. 千万注意不能出现多余的空格。
    (创建的properties文件夹样式如下:)
    在这里插入图片描述
properties文件的解析
1.传统方式
#这是我的配置文件信息
username=小屁
password=00123

下面是传统方法解析properties类型配置文件的过程步骤:

package cn.wolfcode._01_.Demo;

import org.junit.Test;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;

public class getPropertiesTest {
    @Test
    public void getPropertiesValue() {
        FileInputStream fIS = null;
        try {
            //①使用绝对路径利用字符输入流先读取到指定的配置文件
            fIS = new FileInputStream(new File("E:\\JAVAcoldwolf\\idea program\\JavaWeb.Day002\\resource\\User.properties"));
//②将流资源中的数据转换成properties集合数据
            //首先创建一个properties集合对象
            Properties properties = new Properties();
            //使用load方法将数据进行转换
            properties.load(fIS);
            //获取指定key的value值(方法名:getProperty("string 类型的key值"))
            String username = properties.getProperty("username");
            String password = properties.getProperty("password");
            System.out.println(username + "\n" + password);
        } catch (Exception e) {
            e.printStackTrace();
            //使用到流一定记得关闭流资源
        } finally {
            //做流资源非空判断
            try {
                if (fIS != null) {
                    fIS.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}


运行结果:
在这里插入图片描述

2.现代工艺(通过类加载器获取指定流资源)

类加载器(classloader):jvm中专门用来解析指定类的加载工具。
获取类加载器的方法:

  1. 使用反射机制获取
  2. 使用当前正在执行线程对象来获取
    (下面是用反射机制解析propertise文件的过程代码)
 @Test
    //第二种:使用现代工艺解析properties文件(通过类加载器获取流资源对象(不需要使用绝对路径))
    public void threadProperties() {
        //①类加载器对象
        ClassLoader classLoader = getPropertiesTest.class.getClassLoader();
        //通过类加载器对象来获取指定配置文件
        InputStream rAS = classLoader.getResourceAsStream("User.properties");
        //创建Properties类对象
        Properties pp = new Properties();
        try {
            //将流资源对象转换成properties类型(方法:load())
            pp.load(rAS);
            //通过调用方法获取key值对应的value值
            String username = pp.getProperty("username");
            System.out.println(username);
            System.out.println(pp.getProperty("password"));
        } catch (Exception e) {
            e.printStackTrace();
        }
        try {
            if (rAS != null)
                //关闭流资源
                rAS.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
xml文件

文档格式:

  1. xml 文档需在文档第一行做声明,声明表示该文档为 xml 文档
 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    (1) version: 表示xml 的版本
    (2) standalone:yes 表示不可包含其他文档,no或不写表示可包含也可不包含
    (3)ecoding:表示编码格式,文档内容的编码和文件的编码需要统一
  1. <>中放的是标签(属性)名(Element)
  2. 标签中有内容时都是成对出现的<element>内容</element>
  3. 标签中没有内容是可以是单个<element/>
  4. 标签中可以带有属性<element id="1"></element>
  5. xml文件允许嵌套但是不允许交叉嵌套
<?xml version="1.0" encoding="ISO-8859-1"?>
<!--正确嵌套-->
<Teacher>
    <teacher id="1">
        <name>小屁</name>
        <age>18</age>
    </teacher>
</Teacher>

<?xml version="1.0" encoding="ISO-8859-1"?>
<!--错误嵌套-->
<Teacher>
    <teacher id="1">
        <name>小屁<age>18</name>
        </age>
    </teacher>
</Teacher>

  1. xml中注释符号<!--注释内容-->
xml文件解析
DOM方式解析xml文件

(1)DOM:Document Object Model(文档对象模型),xml文挡在加载时,会以DOM树的形式加载进内存中,然后我们通过代码来操作其中的节点(标签)及其文本内容。(js操作hxml也是这种模式)

注意我们对内存中的DOM树进行的所有增删改操作必须进行回写操作,才能将我们所有的操作在xml文件中体现出来。

(2)解析

  • xml文件
<?xml version="1.0" encoding="UTF-8"?>
<Student>
    <student id="1">
        <name>小屁</name>
        <age>18</age>
        <sex></sex>
    </student>
    <student id="2">
        <name>狗蛋</name>
        <age>18</age>
        <sex></sex>
    </student>
</Student>

  • 解析过程
  • (1)查询
package cn.wolfcode._01_.Demo;

import org.junit.Test;
import org.omg.Messaging.SyncScopeHelper;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.File;

public class XmlDOMTest {
    @Test
    public void xmlDOMTest() throws Exception {
        //需求1:获取第二个学生姓名
        //①以绝对路径拿到xml文件
        File file = new File("E:\\JAVAcoldwolf\\idea program\\JavaWeb.Day002\\resource\\student.xml");
        //②获取文档构建者工厂对象
        DocumentBuilderFactory dBF = DocumentBuilderFactory.newInstance();
        //③获取文档构建者对象
        DocumentBuilder dB = dBF.newDocumentBuilder();
        //④获取文档对象
        Document parse = dB.parse(file);
        //现在你已经拿到了文档对象,现在可以操作文档对象的标签及文本内容了
        //①获取根标签
        Element root = parse.getDocumentElement();//注意大小写,一定要和xml文件中的名字一模一样
        //②获取root下所有同名子标签
        NodeList stu = root.getElementsByTagName("student");
        //③指定具体student
        Element item = (Element) stu.item(1);
        //获取指定属性标签
        Element age = (Element) item.getElementsByTagName("name").item(0);//这里的index和你的属性标签在第几个没关系,是看它出现的第几次,从零开始算
        //获取属性标签文本内容
        System.out.println(age.getTextContent());
    }

}

运行结果:
在这里插入图片描述
(2)增加

 @Test
    public void xmlDOMAddTest() throws Exception {
        //获取文档对象
        Document parse = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new File("resource\\student.xml"));
        //通过文档对象直接创建子标签(根标签xml文件中只能有一个,不用管)
        Element student = parse.createElement("student");
        Element name = parse.createElement("name");
        Element age = parse.createElement("age");
        Element sex = parse.createElement("sex");
        //此时这些标签是平级的,给他们分级
        student.appendChild(name);
        student.appendChild(age);
        student.appendChild(sex);
        //给属性标签赋值
        name.setTextContent("阿落");
        age.setTextContent("18");
        sex.setTextContent("男");
        //获取根标签
        Element dE = parse.getDocumentElement();
        //将teacher放在根标签下
        dE.appendChild(student);
        //此时,只是加了一个student在内存中,需要进行回写才能加到xml文件中
        //①获取回写工厂对象
        TransformerFactory tfF = TransformerFactory.newInstance();
        //②根据回写工厂对象获取很回写类对象
        Transformer tf = tfF.newTransformer();
        //调用方法回写
        /**
         * transform(Source src,Result outXml)
         * Source:增删改之后的资源
         * 是接口,传递具体的实现类DOMSource
         * Result:调用输出流将资源写入到xml中
         * 接口:传递具体实现类StreamResult
         */
        tf.transform(new DOMSource(parse),new StreamResult("resource\\student.xml"));
    }

运行结果:
在这里插入图片描述
(3)删除

 //需求3:删除第二个学生
    @Test
    public void xmlDOMRemoveTest() throws Exception {
        //获取文档对象
        Document parse = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse("resource\\student.xml");
        //获取根标签
        Element dE = parse.getDocumentElement();
        //获取子标签
        Node student = dE.getElementsByTagName("student").item(1);
        //删除
        dE.removeChild(student);
        //回写
        TransformerFactory.newInstance().newTransformer().transform(new DOMSource(parse), new StreamResult("resource\\student.xml"));
    }

(4)修改

@Test
    public  void xmlDOMChangeTest() throws Exception {
        //获取文档对象
        Document parse = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse("resource\\student.xml");
        //获取根标签
        Element dE = parse.getDocumentElement();
        //获取子标签
        Element stu = (Element) dE.getElementsByTagName("student").item(0);
        //获取属性标签
        Node age = stu.getElementsByTagName("age").item(0);
        //设置文本内容
        age.setTextContent("20");
        //回写
        TransformerFactory.newInstance().newTransformer().transform(new DOMSource(parse),new StreamResult("resource\\student.xml"));


    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

配置文件及其解析 的相关文章

  • 使用 TreeMap 和 Comparator 按值对 HashMap 进行排序

    我使用以下代码创建哈希图 然后使用树形图和比较器对哈希图中的值进行排序 然而 输出结果却出乎意料 所以任何关于我做错了什么的想法都会有帮助 Code public static void main String args System ou
  • 使用 Intellij 2017.2 /out 目录构建会重复 /build 目录中的文件

    更新到 Intellij 2017 2 后 构建我的项目会创建一个 out包含生成的源文件和资源文件的目录 这些文件与已包含的文件重复 build并导致duplicate class生成的类的编译器错误 关于 Gradle 或 Intell
  • 我该如何解决? KnapSack - 值完全相同,但每个对象都有三个权重

    我在解决我的练习时遇到问题 我读到了动态规划和算法 我认为我的练习是 特定背包问题 我用暴力法解决了它 但我无法用动态规划解决它 我有一艘重300吨的船 背包 有些晶体本身含有 3 种物质 X Y Z 每种物质都有重量 并且所有晶体都具有相
  • 使用 Nginx 时缺少 HTTP 状态代码名称

    我正在使用 Nginx 将所有 HTTP 请求重定向到 HTTPS 在我的 Spring Boot 应用程序中 这是我正在使用的 nginx 配置 通过它我可以将所有请求重定向到 Https 但是当我这样做时 我得到了状态码返回正确 但没有
  • 为什么byteArray的长度是22而不是20?

    我们尝试从字符串转换为Byte 使用以下 Java 代码 String source 0123456789 byte byteArray source getBytes UTF 16 我们得到一个长度为 22 字节的字节数组 我们不确定这个
  • 使用Java获取CSS文件中图像的URL?

    我正在尝试使用 Java 获取远程 CSS 文件中图像 所有 MIME 类型 的 URL 我正在使用 jsoup 来获取 css 的 URL 经过无数个小时的观看CSS解析器 http cssparser sourceforge net 由
  • 为什么 hibernate 在一张表中保存两个 @OneToMany 列表?

    想象一下使用 Hibernate 和 JPA 的简化代码如下 Entity class C Id GeneratedValue public long id MappedSuperclass abstract class A Id Gene
  • 到底什么是哈希冲突

    HashMap 中的哈希冲突或哈希冲突并不是一个新主题 我遇到过几个博客和讨论板 以模糊且详细的方式解释如何产生哈希冲突或如何避免它 我最近在一次采访中遇到了这个问题 我有很多事情要解释 但我认为很难准确地给出正确的解释 抱歉 如果我的问题
  • IntSummaryStatistics的summaryStatistics方法

    为什么空 IntStream 上的 summaryStatistics 方法返回整数的最大和最小值作为流中存在的最大和最小 int 值 IntStream intStream IntStream of IntSummaryStatistic
  • 维护插入顺序的并发集合[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个可以维护插入顺序的并发列表 有人有什么好的推荐吗 我看一些番石榴 例如SetFromMa
  • 在 Java Swing 元素中使用 HTML 样式是不好的做法吗?

    使用 HTML 设置 Swing 元素的样式被认为是不好的做法吗 举个例子 如果我想让标签变大并变红一次 我有两个选择 使用 API 调用 JLabel label new JLabel This is a title label setF
  • java:如何设置全局线程ID?

    是否有可能为线程设置唯一ID 在分布式系统中 线程是在许多不同的机器上创建的 例如通过 RMI 我需要它来创建日志消息 根据我的研究 我知道可以使用 log4j mdc ndc 来完成 但只能在单线程中完成 我的问题是 在创建线程时必须设置
  • Elasticsearch NodeBuilder 与 TransportClient

    对于其他 Elasticsearch 开发人员来说 这可能是一个非常简单 而且愚蠢 的问题 这两者之间有什么区别 我正在从 Java Web 应用程序连接到远程 Elasticsearch 服务器 到目前为止我一直在使用 Transport
  • 如何发现另一个应用程序的意图

    我正在尝试构建一个应用程序来接收来自 StumbleUpon 应用程序的共享 此时 我可以接收浏览器的 共享网址 但是当从 StumbleUpon 共享时 我的应用程序不会显示在列表中 我想我可能没有在清单中注册正确的意图 有什么方法可以找
  • 当通过 Map.put(K, V) 添加值时,是否必须通过 Map.get(K) 返回相同的实例?

    假设您有以下代码 Map
  • Java XML 解析器添加不必要的 xmlns 和 xml:space 属性

    我在 Windows 10 上使用 Java 11 AdoptOpenJDK 11 0 5 2019 10 15 我正在解析一些旧版 XHTML 1 1 文件 这些文件采用以下一般形式
  • Java 中 .NET 的 Lambda 表达式

    我最近 再次 从 C 迁移到 Java 但我非常怀念 lambda 表达式和 C 的 IEnumerable Foreach 之类的东西 所以我正在寻找Java中的lambda表达式库 有比这更好的图书馆吗LambdaJ http code
  • 如何从 jenkins 的现有项目生成 .hpi 插件

    我正在尝试使用 jenkins 的性能插件 但最新版本存在一些问题 如链接中所述 https issues jenkins ci org browse JENKINS 27100 https issues jenkins ci org br
  • Intellij 基本完整的 ctrl + space 在 mac 上不起作用

    我在跑步IntelliJ on my macOS Big Sur and ctl space对于基本完整似乎不起作用 我查看了 首选项 gt 键盘映射 gt 代码完成 gt 基本 它似乎按顺序排列 有任何想法吗 发现操作系统本身已经采取了这
  • 在java中打印阿拉伯字符串

    我试图在 java 中显示阿拉伯语文本 但它显示垃圾字符 示例 或有时在我打印时仅显示问号 我如何才能打印阿拉伯语 我听说它与unicode和UTF 8有关 这是我第一次使用语言 所以不知道 我正在使用 Eclipse Indigo IDE

随机推荐

  • 【蓝桥杯每日一练:递归算法求两个数的最大公约数】

    问题描述 求最大公约数问题 输入格式 输入一行 包含两个正整数 lt 1 000 000 000 输出格式 输出一个正整数 即这两个正整数的最大公约数 输入样例 6 9 输出样例 3 代码 n m map int input split i
  • idea导入Web项目并配置tomcat运行

    文章目录 一 导入项目 二 配置tomcat 三 配置Web项目在tomcat下的运行包 一 导入项目 File gt Open 然后选择要导入的web项目路径 二 配置tomcat 第一步 单机右上角的Edit Configuration
  • 面试题:海量数据去重、Top-k、BitMap问题整理

    问题引入 首先直接进入正题 40亿QQ号如何设计算法去重 相同的QQ号码仅保留一个 内存限制为1个G 腾讯的QQ号都是4字节正整数 所以QQ号码的个数是43亿左右 理论值2 32 1个 又因为是无符号的 翻倍了一下 所以43亿左右 方法1
  • 交错级数如何判断收敛_11种常数项级数敛散性判别法(审敛法)的粗糙总结&11道好玩的小题...

    追不上的上古玄武告诉我们 无穷个正数加在一起不一定是正无穷 以此为开端 有了极限的观念 还有了级数的观念 很多数列的Sn很难求 这篇文章只讨论极其片面的判断常数项级数是否收敛的十一个方法 PART 1 对于十一种 级数敛散性 判别法的粗糙总
  • STATA:缩尾、截尾的概念和命令

  • Python字符串地常规操作:取值,切片,查找,替换,分割,拼接,转义

    字符串操作 字符串取值 字符串取单个值 举例 从零开始 每个字符对应的索引 h 0 e 1 l 3 s hell0 a tong print s 0 print s 5 在这里 符号 也是一个字符 print s 7 索引为7 对应的是 空
  • eclipse 配置 Tomcat 遇到的问题以及解决办法

    Eclipse是一个开发JSP的很好的工具 而笔者在配置Tomcat服务器的时候遇到了一些小问题 在这里给大家总结一些经验 希望能帮助同样遇到这些问题的广大同行们能够简单轻松地解决这些问题 笔者在以前自学JSP的时候曾经用过Tomcat E
  • Android ,java.io.IOException: Failed to instantiate extractor.

    mediaExtractor new MediaExtractor mediaExtractor setDataSource mFilePath mFilePath 为 sd 上路径 sdcard 月亮代表我的心萨克斯2 mp3 1 检查
  • 【Java】环境配置以及快速切换环境的技巧和方法

    前言 前几天想用 burp 抓包来着 发现 burp 突然不能用了 重装了 burp 发现还是不能用 意识到是 java 环境出了问题 在之前有段时间没玩 CTF 去搞开发了 于是java环境糊里糊涂改成了 JAVA 18 结果之前的 bu
  • Android项目JNI层C/C++文件中添加LOG信息

    第一步 在项目的mk文件中加入 LOCAL LDLIBS llog 第二步 在要添加LOG的cpp文件中引入一个头文件和添加一个定义 include
  • M - Mountaineers (MST+树上倍增)

    将原图中点每个点四连通方向的点建边 权值为两点权值中较大者的值 对这个图建立最小生成树 那么最小生成树上任意两点之间路径上的最大点权即为答案 因为是树 所以任意两点间的简单路径唯一 通过树上倍增维护维护树上区间最值求出最大值即可 pragm
  • pid算法控制

    一 先来彻底搞懂PID到底是啥 啥是PID PID 就是 比例 proportional 积分 integral 微分 derivative 是一种很常见的控制算法 在工程实际中 应用最为广泛的调节器控制规律为比例 积分 微分控制 简称PI
  • 数据结构_串的匹配(BF和KMP算法)

    数据结构 串的匹配 BF和KMP算法 BF brute force 算法 算法定义 代码实现 算法分析 KMP算法 算法详解 代码实现 算法分析 子串的定位运算通常被称为串的模式匹配或串匹配 BF brute force 算法 算法定义 一
  • cmd pc如何开多个微信_多个合伙人开公司,股权应该如何分配

    伴随着互联网发展的越来越快 不少的创业型的公司在这快节奏的时代以惊人的速度展现在世人面前 但是这个同时创业的道路也是艰辛的 不过有着志同道合的小伙伴或许能够在成功的道路上又多了几分把握 有句俗话说的好你能走多远 将取决于是谁与你同行 虽然说
  • 【已成功解决】使用vpn/代理后无法正常上网/无法正常访问网站

    文章目录 一 问题描述 二 解决步骤 三 原因分析 一 问题描述 很多同学在学习访问学校提供的资源时或者一些小伙伴在公司办公时需要使用VPN 但是当我们关闭VPN后 却发现没有办法正常连接到互联网了 可以尝试以下方法解决 至于导致这种情况发
  • ANSI是个啥???

    来自 https blog csdn net imxiangzi article details 77370160 http www cnblogs com malecrab p 5300486 html 用Notepad 创建一个文本文件
  • 解决Android 8.1 获取不到wifi名称

    在安卓8 1版本中 用 WifiInfo getSSID 可能出现 unknown ssid 或者什么也没读出来 解决方案 用ConnectivityManager 这个类解决 代码如下 获取SSID param return WIFI 的
  • 前端传JSON嵌套类,且属性名首字母大写时后端接收的一些坑

    因为开发腾讯云业务 要写一个回调函数 规范文档上说会传一个json传给我 EventType ComposeMediaComplete ComposeMediaCompleteEvent TaskId 1256768367 ComposeM
  • stm32局部变量过大,导致栈溢出

    在做一个以stm32为主控的项目时发现自己程序中一个机构体里面的数据总是一运行就被改变 刚开始以为是自己不小心在哪个地方用了extern扩展了变量的作用域 重新赋了值 自己忘记了 后来查找了好久都没有其他地方使用这个结构体变量 于是开始单步
  • 配置文件及其解析

    配置文件 properties xml 配置文件可以解决我们在编程中遇到的硬编码问题 那么什么是硬编码呢 硬编码 将一些经常调用修改的数据代码直接写死在了java源代码程序中 就会产生硬编码问题 一般情况下 通过配置文件来解决硬编码问题 在