日志、类加载器、XML(配置文件)
目录
- 一、日志
- 1.日志技术的概述
- 2.日志技术的体系
- a. Logback
- 3.日志的级别
- 二、类加载器
- 1.概述
- 2.类加载时机
- 3.类加载过程
- 3.类加载器的分类
- 4.常用方法
- 三、XML(配置文件)
- 1.概述
- 2.XML的基本语法
- 3.XML的文档约束
- a.DTD约束
- b.schema约束
- 4.XML文档解析
- a.Dom4j
- b.Xpath
一、日志
1.日志技术的概述
如果我们想知道一个系统运行的过程和详情怎么办? 这时就需要用到日志,生活中的日志就好比日
记,可以记录生活中的点点滴滴;程序中的日志可以用来记录程序运行过程中的信息,并可以进行永久存储。
日志技术具备的优势:
- 可以将系统执行的信息选择性的记录到指定的位置(控制台、文件、数据库中)。
- 可以随时以开关的形式控制是否记录日志,无需修改源代码。
2.日志技术的体系

日志规范大多是一些接口,提供给实现框架去设计的,常见的规范有以上两种。日志的实现框架,现在最常用的就是Lohback。
a. Logback


首先在当前模块下,新建一个文件夹,起名为lib。

然后将三个jar包粘贴到lib文件夹中。

然后再将三个jar包添加为库即可。

将xml文件拷贝到src目录下

代码如下:
public class LoggerDemo1 {//获取日志对象public static final Logger LOGGER = LoggerFactory.getLogger("LoggerDemo1.class");public static void main(String[] args) {//就可以记录用户的操作日志Scanner sc = new Scanner(System.in);System.out.println("请输入用户名:");String username = sc.nextLine();System.out.println("请输入密码:");String password = sc.nextLine();if ("zhangsan".equals(username) && "123".equals(password)) {System.out.println("登陆成功!");LOGGER.info("用户于" + new Date() + "登陆成功,用户名为:" + username + "密码为:" + password);}else {System.out.println("登录失败!");LOGGER.info("用户于" + new Date() + "登陆失败,用户名为:" + username + "密码为:" + password);}}
}
控制台打印,并且写到了日志文件中


3.日志的级别
如果系统上线之后只想记录一些错误的日志信息或者不想记录日志了,就可以通过日志的输出级别来
控制哪些日志信息输出或者不输出。

二、类加载器
1.概述
类加载器负责将字节码文件加载到内存中。

2.类加载时机
- 创建类的实例(对象)。
- 调用类的类方法(静态方法)
- 访问类或者接口的类变量,或者为该类变量赋值。(类变量指的是类中的静态变量)
- 使用反射方式来强制创建某个类或接口对应的Class对象
- 初始化某个类的子类
- 直接使用java.exe命令来运行某个主类
概括为用到这个类就加载,没用到就不加载。
3.类加载过程
一开始字节码文件是存储在硬盘上的,首先通过包名+类名找到想要加载的class字节码文件,然后创建一个流,在通过这个流将字节码文件加载到内存当中,然后在内存中创建一个class对象。



例如我的类成员变量中有一个String类型的变量,当把类加载到内存中的时候,并不知道String这个类在哪里,就需要先用符号来替代,例如“&&&”这个符号。在解析这一步,会将符号替换为String。


3.类加载器的分类
我们自己写的程序大多都是用的第三种类加载器。

双亲委派模型中每一个加载器都是下面加载器的父类。如果我们现在想要用自定义类加载器去加载一个文件,首先自己并不会尝试加载,而是将这个文件一层一层向上委派给父类进行加载。每种加载器都有自己的加载范围,如果父类的加载器不能进行加载,就会一层一层向下返回,然后子加载器才会尝试自己去加载文件。

4.常用方法

public class ClassLoaderDemo1 {public static void main(String[] args) throws IOException {//获取系统类加载器ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();//利用加载器去加载一个指定的文件//参数:文件的路径//返回值:字节流InputStream is = systemClassLoader.getResourceAsStream("prop.properties");Properties prop = new Properties();prop.load(is);System.out.println(prop);is.close();}
}
这是文件中的数据:

结果:

三、XML(配置文件)
1.概述
配置文件用来保存程序在运行时需要的一些参数。例如IDEA就有相应的配置文件,里面有IDEA的背景图片、字体信息、字号信息等等。常见的配置文件有以下三种,txt,properties,xml:

三种配置文件的优缺点:
TxT文件
- 优点:几乎没有优点
- 缺点:不利于阅读
properties文件:
- 优点:键值对形式易于阅读
- 缺点:无法配置一组一组得数据
XML文件:
- 优点:易于阅读,可以配置成组出现的数据
- 缺点: 解析比较复杂
如果以后配置信息数据量比较少,一个键只对应一个值,就是用properties。数据量多就使用XML。
下图是XML文件的概述和作用

2.XML的基本语法


对于XML中的其他组成,对于小于号(<),大于号(>)等等一些特殊字符就需要用特殊的标记来写,下图中给出了特殊的标记。
对于CDATA区,CDATA区中的所有内容都可以当做是文本内容,即小于号、大于号等特殊字符可以直接写,不需要用特殊的标记。

XML文件代码如下:
<?xml version="1.0" encoding="UTF-8" ?><students><!-- 下面表示第一个学生的信息 --><student id = "1"><name>张三</name><!-- 表示1<2--><name>1 < 2</name><!--CDATA区 --><name> <![CDATA[<<<<<<<< >>>>>>>>>]]> </name></student></students>
在浏览器中显示的效果如下:

3.XML的文档约束
文档约束是用来限定xml文件中的标签以及属性应该怎么写,以此强制约束程序员必须按照文档约束的规定来编写xml文件。
常见的约束分为DTD约束和schema约束。
a.DTD约束

下面是dtd文件约束:

这是xml配置文件代码,必须严格按照dtd文件的格式进行书写,标签什么的都要一致:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE 书架 SYSTEM 'book.dtd'>
<书架><书><书名>西游记</书名><作者>吴承恩</作者><售价>23</售价></书><书><书名>西游记</书名><作者>吴承恩</作者><售价>23</售价></书>
</书架>
但dtd约束不能约束具体的数据类型。
b.schema约束

schema文件代码如下:

xml文件代码书写如下:

4.XML文档解析
a.Dom4j
我们要利用Dom4j(第三方库)来对一个XML文件的数据进行解析。

方法如下:


代码如下:
XML文件
<?xml version="1.0" encoding="UTF-8" ?>
<persons><person id = "1"><name>zhangsan</name><age>23</age></person><person id = "2"><name>lisi</name><age>24</age></person><person id = "3"><name>wangwu</name><age>23</age></person></persons>
测试用例:
public class Demo4jDemo1 {public static void main(String[] args) throws DocumentException {//1.创建解析器的对象SAXReader saxReader = new SAXReader();//2.利用解析器去读取xml文件,并返回文档对象File file = new File("day33\\src\\xmldemo3\\person.xml");Document document = saxReader.read(file);//3.自己解析的时候,一定要一层一层的解析//获取根标签Element rootElement = document.getRootElement();//获取根标签中的子标签List<Element> elements = rootElement.elements();for (Element element : elements) {//继续获取里面的内容//获取属性Attribute id = element.attribute("id");//获取里面的值String text = id.getText();//获取标签nameElement name = element.element("name");String text1 = name.getText();//ageElement age = element.element("age");String text2 = age.getText();//可以新建一个对象类,然后把这些数据都赋值给对象的属性,就可以变成一个一个对象System.out.println(text + "," + text1 + "," + text2);}}
}

b.Xpath
当我们想要获得XML文件中某一个子标签时,就可以使用Xpath路径检索。
首先我们需要将第三方库添加到我们的项目中。


下面参数中所说的表达式代表的是路径。路径有绝对路径、相对路径(用的不多)、全文检索、属性查找。

XML文件代码如下:
<?xml version="1.0" encoding="UTF-8" ?>
<persons><person id = "1"><name>zhangsan</name><age>23</age></person><person id = "2"><name>lisi</name><age>24</age></person><person id = "3"><name>wangwu</name><age>23</age></person><name>zhaoliu</name></persons>
绝对路径:
public class XPathDemo1 {public static void main(String[] args) throws DocumentException {//1.创建解释器对象SAXReader saxReader = new SAXReader();//2.加载XML文件获得Document对象File file = new File("day33\\src\\xpathdemo\\person.xml");Document document = saxReader.read(file);//检索多个List<Element> list = document.selectNodes("/persons/person/name");for (Element element : list) {//获得标签中的文本内容System.out.println(element.getText());}System.out.println("--------------------------------");//检索单个//如果有多个相同的标签,会获取到第一个Element node = (Element) document.selectSingleNode("/persons/person/name");System.out.println(node.getText());}
}

全文检索:

public class XPathDemo2 {public static void main(String[] args) throws DocumentException {//1.创建解释器对象SAXReader saxReader = new SAXReader();//2.加载XML文件获得Document对象File file = new File("day33\\src\\xpathdemo\\person.xml");Document document = saxReader.read(file);//全文检索 (//contact)List<Element> list = document.selectNodes("//name");for (Element element : list) {System.out.println(element.getText());}System.out.println("--------------------------------");//全文检索 (//contact/name)List<Element> list1 = document.selectNodes("//person/name");for (Element element : list1) {System.out.println(element.getText());}}
}

属性检索:

public class XPathDemo3 {public static void main(String[] args) throws DocumentException {//1.创建解释器对象SAXReader saxReader = new SAXReader();//2.加载XML文件获得Document对象File file = new File("day33\\src\\xpathdemo\\person.xml");Document document = saxReader.read(file);//查找属性List<Attribute> list = document.selectNodes("//@id");for (Attribute attribute : list) {System.out.println(attribute.getName());}System.out.println("-----------------------------------");//查找带有指定属性的标签List<Element> list1 = document.selectNodes("//person[@id]");for (Element element : list1) {System.out.println(element.getName());}}
}

相关文章:
日志、类加载器、XML(配置文件)
目录 一、日志1.日志技术的概述2.日志技术的体系a. Logback 3.日志的级别 二、类加载器1.概述2.类加载时机3.类加载过程3.类加载器的分类4.常用方法 三、XML(配置文件)1.概述2.XML的基本语法3.XML的文档约束a.DTD约束b.schema约束 4.XML文档解析a.Dom4jb…...
Flutter中的const和final的区别
目录 一、核心区别对比表 二、初始化机制深度解析 1. const 的编译期特性 2. final 的运行时特性 三、内存管理差异 1. const 的内存优化 2. final 的独立内存 四、集合类型的本质区别 1. const 集合的完全不可变性 2. final 集合的引用不可变性 五、在 Flutter 中的…...
DAY34 贪心算法Ⅲ
134. 加油站 - 力扣(LeetCode) 这种环路问题要记一下。 class Solution { public:int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {int curSum0;int totalSum0;int start0;for(int i0;i<gas.size();i){curSumga…...
AI大白话(一):5分钟了解AI到底是什么?
🌟引言: 在这个信息爆炸的时代,“人工智能”、“AI”、“机器学习”、"深度学习"等词汇频繁出现在我们的生活中。 从手机里的语音助手,到网购平台的个性化推荐,再到最近大火的AI绘画和ChatGPT,人…...
(七)Spring Boot学习——Redis使用
有部分内容是常用的,为了避免每次都查询数据库,将部分数据存入Redis。 一、 下载并安装 Redis Windows 版的 Redis 官方已不再维护,你可以使用 微软提供的 Redis for Windows 版本 或者 使用 WSL(Windows Subsystem for Linux&a…...
蓝桥与力扣刷题(蓝桥 字符统计)
题目:给定一个只包含大写字母的字符出 S, 请你输出其中出现次数最多的字符。如果有多个字母均出现了最多次, 按字母表顺序依次输出所有这些字母。 输入格式 一个只包含大写字母的字等串 S. 输出格式 若干个大写字母,代表答案。 样例输入 BABBACAC样…...
AtCoder Beginner Contest 397(ABCDE)
目录 A - Thermometer 翻译: 思路: 实现: B - Ticket Gate Log 翻译: 思路: 实现: C - Variety Split Easy 翻译: 思路: 实现: D - Cubes 翻译:…...
Profinet转Profinet以创新网关模块为核心搭建西门子和欧姆龙PLC稳定通讯架构案例
你是否有听过PROFINET主站与PROFINET主站之间需要做数据通讯有需求? 例如西门子1500与霍尼韦尔DCS系统两个主站之间的通讯。应用于PROFINET为主站设备还有欧姆龙、基恩士、罗克韦尔、施耐德、GE、ABB等品牌的PLC或DCS、FCS等平台。在生产或智能领域有通讯需求。两头…...
计算机视觉|Swin Transformer:视觉 Transformer 的新方向
一、引言 在计算机视觉领域的发展历程中,卷积神经网络(CNN) 长期占据主导地位。从早期的 LeNet 到后来的 AlexNet、VGGNet、ResNet 等,CNN 在图像分类、目标检测、语义分割等任务中取得了显著成果。然而,CNN 在捕捉全…...
C++单例模式精解
单例模式(重点*) 单例模式是23种常用设计模式中最简单的设计模式之一,它提供了一种创建对象的方式,确保只有单个对象被创建。这个设计模式主要目的是想在整个系统中只能出现类的一个实例,即一个类只有一个对象。 将单…...
【java】集合练习2
Student.java:保存学生类的定义。 public class Student {private String name;private int age;public Student(String name, int age) {this.name name;this.age age;}public String getName() { return name; }public int getAge() { return age; }Overridepu…...
FineBI_实现求当日/月/年回款金额分析
需求:原始数据结构如下,需要在分组表中,实现各城市当日/月/年的合同金额分析 实现步骤: ①维度拖入城市 ②分别取当日/月/年合同金额 当日DEF(SUM_AGG(${ 地区数据分析1 _ 合同金额 }),[${ 地区数据分析1 _ 城市 }],[LEFT(${ 地…...
【计算机网络】2物理层
物理层任务:实现相邻节点之间比特(或)的传输 1.通信基础 1.1.基本概念 1.1.1.信源,信宿,信道,数据,信号 数据通信系统主要划分为信源、信道、信宿三部分。 信源:产生和发送数据的源头。 信宿:接收数据的终点。 信道:信号的传输介质。 数据和信号都有模拟或数字…...
解决PC串流至IPad Pro时由于分辨率不一致导致的黑边问题和鼠标滚轮反转问题
问题背景 今天在做 电脑串流ipad pro 的时候发现了2个问题: 1.ipadpro 接上鼠标后,滚轮上下反转,这个是苹果自己的模拟造成的问题,在设置里选择“触控板与鼠标”。 关闭“自然滚动”,就可以让鼠标滚轮正向滚动。 2. ipadpro 分…...
在办公电脑上本地部署 70b 的 DeepSeek 模型并实现相应功能的大致步骤
以下是为客户在办公电脑上本地部署 70b 的 DeepSeek 模型并实现相应功能的大致步骤: 硬件准备: 70b 模型对硬件要求较高,确保办公电脑有足够强大的 GPU(例如 NVIDIA A100 等高端 GPU,因为模型规模较大,普通…...
LLMs之CoD:《Chain of Draft: Thinking Faster by Writing Less》翻译与解读
LLMs之CoD:《Chain of Draft: Thinking Faster by Writing Less》翻译与解读 导读:这篇论文的核心是提出了一种名为“Chain of Draft”(CoD,草稿链)的新型提示策略,用于改进大型语言模型(LLMs&a…...
Docker安装mysql——Linux系统
拉取mysql镜像 docker pull mysql 查看镜像 docker images 运行镜像(这一步的作用:数据持久化,通过挂载卷将日志、数据和配置文件存储在主机上,避免容器删除导致数据丢失) docker run -p 3306:3306 --name mysql …...
0CTF 2016 piapiapia 1
#源码泄露 #代码审计 #反序列化字符逃逸 #strlen长度过滤数组绕过 www.zip 得到源码 看到这里有flag ,猜测服务端docker的主机里,$flag变量应该存的就是我们要的flag。 于是,我们的目的就是读取config.php 利用思路 这里存在 任意文件读取…...
2、危机应对-核心成员突然退出
一、场景: 当你团队中的骨干突然退出项目,如开发主程不干了,交付经理如何应对? 二、思考: 处理核心成员退出的本质是“通过系统性的减震降低人岗绑定的风险” 三、处理方式: 1、紧急评估影响 技术影响…...
python_巨潮年报pdf下载
目录 前置: 步骤: step one: pip安装必要包,获取年报url列表 step two: 将查看url列表转换为pdf url step three: 多进程下载pdf 前置: 1 了解一些股票的基本面需要看历年年报,在巨潮一个个下载比较费时间&…...
单片机自学指南
一、单片机基础入门 单片机的概念与发展历程 常见单片机类型介绍(如 51 系列、STM32 系列等) 单片机在生活与工业中的应用实例剖析 二、硬件原理学习 单片机内部结构详解(CPU、存储器、I/O 口等) 时钟电路与复位电路原理 电…...
Netty基础—6.Netty实现RPC服务三
大纲 1.RPC的相关概念 2.RPC服务调用端动态代理实现 3.Netty客户端之RPC远程调用过程分析 4.RPC网络通信中的编码解码器 5.Netty服务端之RPC服务提供端的处理 6.RPC服务调用端实现超时功能 5.Netty服务端之RPC服务提供端的处理 (1)RPC服务提供端NettyServer (2)基于反射…...
用vue3显示websocket的状态
在上次vue3项目上增加一个标签,显示当前的连接状态,两个按钮:重新连接 和 断开连接 修改App.vue <template><header><title>ws状态测试</title></header><main><WsStatus /></main> </template>…...
python拉取大视频导入deepseek大模型解决方案
使用Python拉取大视频并导入大模型,需要综合考虑数据获取、存储、处理和资源管理,确保高效稳定地处理大视频数据,同时充分利用大模型的性能,以下是分步方案及代码示例: --- 1. 分块下载大视频(避免内存溢出…...
为什么需要使用十堰高防服务器?
十堰高防服务器的核心价值与应用必要性 一、应对复杂攻击的防御能力 T级DDoS攻击防护 十堰高防服务器搭载 T级清洗中心,支持智能流量调度与分层处理,可抵御 800Gbps-1.2Tbps 的大规模混合攻击(如SYN Flood、UDP反射ÿ…...
[特殊字符] 深度实战:Android 13 系统定制之 Recovery 模式瘦身指南
🌟 核心需求 在 Android 13 商显设备开发中,需精简 Recovery 模式的菜单选项(如Reboot to bootloader/Enter rescue),但直接修改g_menu_actions后在User 版本出现黑屏卡死问题,需综合方案解决。 ǵ…...
向量数据库技术系列四-FAISS介绍
一、前言 FAISS(Facebook AI Similarity Search)是由Facebook AI Research开发的一个开源库,主要用于高效地进行大规模相似性搜索和聚类操作。主要功能如下: 向量索引与搜索:FAISS提供了多种索引和搜索向量的方法&…...
人工智能中的线性代数基础详解
线性代数是人工智能领域的重要数学基础之一,是人工智能技术的底层数学支柱,它为数据表示、模型构建和算法优化提供了核心工具。其核心概念与算法应用贯穿数据表示、模型训练及优化全过程。更多内容可看我文章:人工智能数学基础详解与拓展-CSDN博客 一、基本介绍 …...
格雷码.
格雷码 - OI Wiki 格雷码_百度百科 简介 格雷码(Gray Code),又称为二进制格雷码或循环二进制码,是一种二进制编码方式。它得名于贝尔实验室的工程师弗兰克格雷(Frank Gray),他于1940年代提出…...
【毕业论文格式】word分页符后的标题段前间距消失
文章目录 【问题描述】 分页符之后的段落开头,明明设置了标题有段前段后间距,但是没有显示间距: 【解决办法】 选中标题,选择边框 3. 选择段前间距,1~31磅的一个数 结果...
