日志、类加载器、XML(配置文件)

news2025/3/17 14:10:02

目录

  • 一、日志
    • 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.日志技术的概述

如果我们想知道一个系统运行的过程和详情怎么办? 这时就需要用到日志,生活中的日志就好比日
记,可以记录生活中的点点滴滴;程序中的日志可以用来记录程序运行过程中的信息,并可以进行永久存储。

日志技术具备的优势:

  1. 可以将系统执行的信息选择性的记录到指定的位置(控制台、文件、数据库中)。
  2. 可以随时以开关的形式控制是否记录日志,无需修改源代码。

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.类加载时机

  1. 创建类的实例(对象)。
  2. 调用类的类方法(静态方法)
  3. 访问类或者接口的类变量,或者为该类变量赋值。(类变量指的是类中的静态变量)
  4. 使用反射方式来强制创建某个类或接口对应的Class对象
  5. 初始化某个类的子类
  6. 直接使用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文件

  1. 优点:几乎没有优点
  2. 缺点:不利于阅读

properties文件:

  1. 优点:键值对形式易于阅读
  2. 缺点:无法配置一组一组得数据

XML文件:

  1. 优点:易于阅读,可以配置成组出现的数据
  2. 缺点: 解析比较复杂

如果以后配置信息数据量比较少,一个键只对应一个值,就是用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 &lt; 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();

            //获取标签name
            Element name = element.element("name");
            String text1 = name.getText();

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

在这里插入图片描述

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

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

相关文章

AI大白话(一):5分钟了解AI到底是什么?

&#x1f31f;引言&#xff1a; 在这个信息爆炸的时代&#xff0c;“人工智能”、“AI”、“机器学习”、"深度学习"等词汇频繁出现在我们的生活中。 从手机里的语音助手&#xff0c;到网购平台的个性化推荐&#xff0c;再到最近大火的AI绘画和ChatGPT&#xff0c;人…

蓝桥与力扣刷题(蓝桥 字符统计)

题目&#xff1a;给定一个只包含大写字母的字符出 S, 请你输出其中出现次数最多的字符。如果有多个字母均出现了最多次, 按字母表顺序依次输出所有这些字母。 输入格式 一个只包含大写字母的字等串 S. 输出格式 若干个大写字母&#xff0c;代表答案。 样例输入 BABBACAC样…

AtCoder Beginner Contest 397(ABCDE)

目录 A - Thermometer 翻译&#xff1a; 思路&#xff1a; 实现&#xff1a; B - Ticket Gate Log 翻译&#xff1a; 思路&#xff1a; 实现&#xff1a; C - Variety Split Easy 翻译&#xff1a; 思路&#xff1a; 实现&#xff1a; D - Cubes 翻译&#xff1a…

Profinet转Profinet以创新网关模块为核心搭建西门子和欧姆龙PLC稳定通讯架构案例​

你是否有听过PROFINET主站与PROFINET主站之间需要做数据通讯有需求&#xff1f; 例如西门子1500与霍尼韦尔DCS系统两个主站之间的通讯。应用于PROFINET为主站设备还有欧姆龙、基恩士、罗克韦尔、施耐德、GE、ABB等品牌的PLC或DCS、FCS等平台。在生产或智能领域有通讯需求。两头…

计算机视觉|Swin Transformer:视觉 Transformer 的新方向

一、引言 在计算机视觉领域的发展历程中&#xff0c;卷积神经网络&#xff08;CNN&#xff09; 长期占据主导地位。从早期的 LeNet 到后来的 AlexNet、VGGNet、ResNet 等&#xff0c;CNN 在图像分类、目标检测、语义分割等任务中取得了显著成果。然而&#xff0c;CNN 在捕捉全…

C++单例模式精解

单例模式&#xff08;重点*&#xff09; 单例模式是23种常用设计模式中最简单的设计模式之一&#xff0c;它提供了一种创建对象的方式&#xff0c;确保只有单个对象被创建。这个设计模式主要目的是想在整个系统中只能出现类的一个实例&#xff0c;即一个类只有一个对象。 将单…

【java】集合练习2

Student.java&#xff1a;保存学生类的定义。 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_实现求当日/月/年回款金额分析

需求&#xff1a;原始数据结构如下&#xff0c;需要在分组表中&#xff0c;实现各城市当日/月/年的合同金额分析 实现步骤&#xff1a; ①维度拖入城市 ②分别取当日/月/年合同金额 当日DEF(SUM_AGG(${ 地区数据分析1 _ 合同金额 }),[${ 地区数据分析1 _ 城市 }],[LEFT(${ 地…

【计算机网络】2物理层

物理层任务:实现相邻节点之间比特(或)的传输 1.通信基础 1.1.基本概念 1.1.1.信源,信宿,信道,数据,信号 数据通信系统主要划分为信源、信道、信宿三部分。 信源:产生和发送数据的源头。 信宿:接收数据的终点。 信道:信号的传输介质。 数据和信号都有模拟或数字…

解决PC串流至IPad Pro时由于分辨率不一致导致的黑边问题和鼠标滚轮反转问题

问题背景 今天在做 电脑串流ipad pro 的时候发现了2个问题&#xff1a; 1.ipadpro 接上鼠标后&#xff0c;滚轮上下反转&#xff0c;这个是苹果自己的模拟造成的问题&#xff0c;在设置里选择“触控板与鼠标”。 关闭“自然滚动”,就可以让鼠标滚轮正向滚动。 2. ipadpro 分…

LLMs之CoD:《Chain of Draft: Thinking Faster by Writing Less》翻译与解读

LLMs之CoD&#xff1a;《Chain of Draft: Thinking Faster by Writing Less》翻译与解读 导读&#xff1a;这篇论文的核心是提出了一种名为“Chain of Draft”&#xff08;CoD&#xff0c;草稿链&#xff09;的新型提示策略&#xff0c;用于改进大型语言模型&#xff08;LLMs&a…

0CTF 2016 piapiapia 1

#源码泄露 #代码审计 #反序列化字符逃逸 #strlen长度过滤数组绕过 www.zip 得到源码 看到这里有flag &#xff0c;猜测服务端docker的主机里&#xff0c;$flag变量应该存的就是我们要的flag。 于是&#xff0c;我们的目的就是读取config.php 利用思路 这里存在 任意文件读取…

python_巨潮年报pdf下载

目录 前置&#xff1a; 步骤&#xff1a; step one: pip安装必要包&#xff0c;获取年报url列表 step two: 将查看url列表转换为pdf url step three: 多进程下载pdf 前置&#xff1a; 1 了解一些股票的基本面需要看历年年报&#xff0c;在巨潮一个个下载比较费时间&…

为什么需要使用十堰高防服务器?

十堰高防服务器的核心价值与应用必要性 一、‌应对复杂攻击的防御能力‌ ‌T级DDoS攻击防护‌ 十堰高防服务器搭载 ‌T级清洗中心‌&#xff0c;支持智能流量调度与分层处理&#xff0c;可抵御 ‌800Gbps-1.2Tbps‌ 的大规模混合攻击&#xff08;如SYN Flood、UDP反射&#xff…

人工智能中的线性代数基础详解

‌ 线性代数是人工智能领域的重要数学基础之一,是人工智能技术的底层数学支柱,它为数据表示、模型构建和算法优化提供了核心工具。其核心概念与算法应用贯穿数据表示、模型训练及优化全过程。更多内容可看我文章:人工智能数学基础详解与拓展-CSDN博客 一、基本介绍 …

【毕业论文格式】word分页符后的标题段前间距消失

文章目录 【问题描述】 分页符之后的段落开头&#xff0c;明明设置了标题有段前段后间距&#xff0c;但是没有显示间距&#xff1a; 【解决办法】 选中标题&#xff0c;选择边框 3. 选择段前间距&#xff0c;1~31磅的一个数 结果

【蓝桥杯每日一题】3.16

&#x1f3dd;️专栏&#xff1a; 【蓝桥杯备篇】 &#x1f305;主页&#xff1a; f狐o狸x 目录 3.9 高精度算法 一、高精度加法 题目链接&#xff1a; 题目描述&#xff1a; 解题思路&#xff1a; 解题代码&#xff1a; 二、高精度减法 题目链接&#xff1a; 题目描述&…

2.7 滑动窗口专题:串联所有单词的子串

LeetCode 30. 串联所有单词的子串算法对比分析 1. 题目链接 LeetCode 30. 串联所有单词的子串 2. 题目描述 给定一个字符串 s 和一个字符串数组 words&#xff0c;words 中所有单词长度相同。要求找到 s 中所有起始索引&#xff0c;使得从该位置开始的连续子串包含 words 中所…

电脑实用小工具--VMware常用功能简介

一、创建、编辑虚拟机 1.1 创建新的虚拟机 详见文章新创建虚拟机流程 1.2 编辑虚拟机 创建完成后&#xff0c;点击编辑虚拟机设置&#xff0c;可对虚拟机内存、处理器、硬盘等各再次进行编辑设置。 二、虚拟机开关机 2.1 打开虚拟机 虚拟机创建成功后&#xff0c;点击…

为训练大模型而努力-分享2W多张卡通头像的图片

最近我一直在研究AI大模型相关的内容&#xff0c;想着从现在开始慢慢收集各种各样的图片&#xff0c;万一以后需要训练大模型的时候可以用到&#xff0c;或者自己以后也许会需要。于是决定慢慢收集这些图片&#xff0c;为未来的学习和训练大模型做一些铺垫&#xff0c;哈哈。 …