09 配置文件日志多线程

news2024/9/21 16:34:02

配置文件

配置文件

  • 在企业开发过程中,我们习惯把一些需要灵活配置的数据放在一些文本文件中,而不是在Java代码写死
  • 我们把这种存放程序配置信息的文件,统称为配置文件

配置文件一般要求有明确的格式,以方便读写操作!!!

image-20240414082438140

Properties

image-20240414082744207

什么是Properties?

  • 是一个Map集合(键值对集合),但是我们一般不会当集合使用。
  • 核心作用:Properties是用来代表属性文件的,通过Properties可以读写属性文件里的内容。
  • Properties的作用?
    • 可以存储Properties属性集的键值对数据到属性文件中去:
      • void store(Writer writer, String comments)
    • 可以加载属性文件中的数据到Properties对象中来:
      • void load(Reader reader)

使用Properties读取属性文件里的键值对数据

构造器说明
public Properties()用于构建Properties集合对象(空容器)
常用方法说明
public void load(InputStream is)通过字节输入流,读取属性文件里的键值对数据
public void load(Reader reader)通过字符输入流,读取属性文件里的键值对数据
public String getProperty(String key)根据键获取值(其实就是get方法的效果)
public Set stringPropertyNames()获取全部键的集合(其实就是ketSet方法的效果)

使用Properties把键值对数据写出到属性文件里去

构造器说明
public Properties()用于构建Properties集合对象(空容器)
常用方法说明
public Object setProperty(String key, String value)保存键值对数据到Properties对象中去。
public void store(OutputStream os, String comments)把键值对数据,通过字节输出流写出到属性文件里去
public void store(Writer w, String comments)把键值对数据,通过字符输出流写出到属性文件里去

XML

XML是什么?
  • 全称Extensible Markup Language, 可扩展标记语言
  • 本质是一种数据的格式,可以用来存储复杂的数据结构,和数据关系。

XML的特点

  • XML中的“<标签名>” 称为一个标签或一个元素,一般是成对出现的。
  • XML中的标签名可以自己定义(可扩展),但必须要正确的嵌套。
  • XML中只能有一个根标签。
  • XML中的标签可以有属性。
  • 如果一个文件中放置的是XML格式的数据,这个文件就是XML文件,后缀一般要写成.xml。
XML语法

XML文件的后缀名为:xml,文档声明必须是第一行

<?xml version="1.0" encoding="UTF-8" ?>
version:XML默认的版本号码、该属性是必须存在的
encoding:本XML文件的编码

XML中可以定义注释信息:<!- 注释内容 -->,快捷键是Ctrl+shift+/
XML中书写”<”、“&”等,可能会出现冲突,导致报错,此时可以用如下特殊字符替代。

&lt;    <  小于
&gt;    >  大于
&amp;   &  和号
&apos;  '  单引号
&quot;  "  引号

XML中可以写一个叫CDATA的数据区: <![CDATA[   …内容…  ]]>,里面的内容可以随便写。

XML的作用
  • 用于进行存储数据和传输数据
  • 作为软件的配置文件
应用场景
  • 本质是一种数据格式,可以存储复杂的数据结构,和数据关系。
  • 应用场景:经常用来做为系统的配置文件;或者作为一种特殊的数据结构,在网络中进行传输。
XML解析技术

使用程序读取XML文件中的数据

注意:程序员并不需要自己写原始的IO流代码来解析XML,难度较大!也相当繁琐!

其实,有很多开源的,好用的,解析XML的框架,最知名的是:Dom4j(第三方研发的)

DOM4J解析XML文件的思想:文档对象模型

image-20240414085846935

Dom4J的解析思想?

  • 得到文档对象Document,从中获取元素对象和内容。
Dom4j解析XML-得到Document对象

SAXReader:Dom4j提供的解析器,可以认为是代表整个Dom4j框架

构造器/方法说明
public SAXReader()构建Dom4J的解析器对象
public Document read(String path)把XML文件读成Document对象

Document

方法名说明
Element getRootElement()获得根元素对象
Element提供的方法
方法名说明
public String getName()得到元素名字
public List elements()得到当前元素下所有子元素
public List elements(String name)得到当前元素下指定名字的子元素返回集合
public Element element(String name)得到当前元素下指定名字的子元素,如果有很多名字相同的返回第一个
public String attributeValue(String name)通过属性名直接得到属性值
public String elementText(子元素名)得到指定名称的子元素的文本
public String getText()得到文本

Dom4J的解析后的数据形式。

  • 通常数据会封装成Java的对象,如单个对象,或者集合对象形式。
建议
  • 如何使用程序把数据写出到XML文件中去?
    • 不建议用 dom4j
    • 推荐直接把程序里的数据拼接成XML格式, 然后用IO流写出

XML约束

什么是XML约束

就是限制XML文件只能按照某种格式进行书写。

image-20240414091403847

约束文档分为: DTD Schema文档

XML文档约束-DTD的使用(了解)

需求:利用DTD约束文档,约束一个XML文件的编写。
编写DTD约束文档,后缀必须是.dtd

<!ELEMENT 书架 (书+)> <!ELEMENT 书 (书名,作者,售价)> <!ELEMENT 书名 (#PCDATA)> <!ELEMENT 作者 (#PCDATA)> <!ELEMENT 售价 (#PCDATA)>

在需要编写的XML文件中导入该DTD约束文档

然后XML文件,就必须按照DTD约束文档指定的格式进行编写,否则报错!

作用和问题

  • 可以约束XML文件的编写
  • 不能约束具体的数据类型
XML文档约束-schema的使用(了解)

可以约束XML文件的编写、和数据类型

  • 需求:利用schema文档约束,约束一个XML文件的编写。
  • 编写schema约束文档,后缀必须是.xsd,具体的形式到代码中观看。
  • 在需要编写的XML文件中导入该schema约束文档
  • 按照约束内容编写XML文件的标签。

优点?

  • 可以约束XML文件的标签内容格式,以及具体的数据类型。
  • 本身也是xml文件,格式更严谨。

XML检索技术:Xpath

Xpath作用,四大类。

  • 检索XML文件中的信息
  • 绝对路径: /根元素/子元素/孙元素
  • 相对路径:./子元素/孙元素
  • 全文检索://contact
  • 属性查找://@属性名 、//元素[@属性名]、//元素//[@属性名=‘值’]

日志

概述

什么是日志?

  • 用来记录程序运行过程中的信息,并可以进行永久存储。

输出语句的弊端

  • 日志会展示在控制台
  • 不能更方便的将日志记录到其他的位置(文件,数据库)
  • 想取消日志,需要修改源代码才可以完成
日志技术
  • 可以将系统执行的信息,方便的记录到指定的位置(控制台、文件中、数据库中)。
  • 可以随时以开关的形式控制日志的启停,无需侵入到源代码中去进行修改。
体系架构
image-20240414104100582

日志接口

  • 日志接口大多是一些规范,用来约束日志实现框架的设计。
  • Commons Logging、Simple Logging Facade for Java(slf4j)

日志框架

  • Log4J、Logback(我们重点学习的,其他的都大同小异)。

  • Logback是基于slf4j日志接口实现的日志框架。

  • 注意1:因为对Commons Logging接口不满意,有人就搞了SLF4J;因为对Log4j的性能不满意,有人就搞了Logback。

  • 注意2:Logback是基于slf4j的日志规范实现的框架。

输出语句存在的问题,日志技术应该具备哪些特点和优势

输出语句日志技术
输出位置输出到控制台可以将日志信息写入到文件或者数据库中
取消日志需要修改代码,灵活性比较差不需要修改代码,灵活性比较好
多线程性能较差性能较好

Logback日志框架官方网站:

Logback日志框架模版

Logback日志框架有以下几个模块:

  • logback-core 01
    • 基础模块,是其他两个模块依赖的基础(必须有)
  • logback-classic 02
    • 基础模块,是其他两个模块依赖的基础(必须有)
  • logback-access 03
    • 与 Tomcat 和 Jetty 等 Servlet 容器集成,以提供 HTTP 访问日志的功能(可选,以后再接触)

想使用Logback日志框架,至少需要在项目中整合如下三个模块:

  1. slf4j-api:日志接口
  2. logback-core:基础模块
  3. logback-classic:功能模块,它完整实现了slf4j API

常见的日志实现框架有哪些?

  • Log4J、Logback(我们重点学习的,其他的都大同小异)
  • Logback是基于slf4j日志接口实现的日志框架

Logback快速入门

步骤

需求

l使用Logback日志框架,纪录系统的运行信息。

实现步骤

  1. 在项目下新建文件夹lib,导入Logback的相关jar包到该文件夹下,并添加到项目库中去。
    导入Logback框架到项目中去。
    • slf4j-api:日志接口
    • logback-core
    • logback-classic
  2. 将Logback框架的核心配置文件logback.xml直接拷贝到src目录下(必须是src下)。
  3. 创建Logback框架提供的Logger对象,然后用Logger对象调用其提供的方法就可以记录系统的日志信息。
    • public static final Logger LOGGER = LoggerFactory.getLogger("当前类类名");
  4. 调用日志对象的方法记录日志信息
核心配置文件logback.xml
Logback日志框架进行控制的。

日志的输出位置、输出格式的设置
    
通常可以设置2个输出日志的位置: 一个是控制台、一个是系统文件中
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> // 输出到控制台的配置标志
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> // 输出到系统文件的配置标志
开启日志(ALL),取消日志(OFF)
<root level="ALL">
    <appender-ref ref="CONSOLE"/>
    <appender-ref ref="FILE" />
</root>

Logback设置日志级别

什么是日志级别

日志级别指的是日志信息的类型,日志都会分级别,常见的日志级别如下(优先级依次升高):

日志级别说明
trace追踪,指明程序运行轨迹
debug调试,实际应用中一般将其作为最低级别,而 trace 则很少使用
info输出重要的运行信息,数据连接、网络连接、IO操作等等,使用较多
warn警告信息,可能会发生问题,使用较多
error错误信息, 使用较多

设置日志输出级别的作用是什么?

  • 用于控制系统中哪些日志级别是可以输出的。

Logback的日志级别是什么样的?

  • ALL 和OFF分别是打开全部日志和关闭全部日志
  • 级别程度依次是: TRACE< DEBUG< INFO<WARN<ERROR
  • 默认级别是debug (忽路大闯.只输出当前级别及高于该级别的日志
为什么学习日志级别
<root level=“info">
    <appender-ref ref="CONSOLE"/>
    <appender-ref ref="FILE" />
</root>
只有日志的级别是大于或等于核心配置文件配置的日志级别,才会被记录,否则不记录。

多线程

多线程介绍

什么是线程?
  • 线程:简单的说,就是计算机在做一件事
  • 单线程:在计算机中同一时间只能做一件事
  • 多线程:在计算机中同一时间可以做多件事

好处

  • 减少队列阻塞带来的影响
  • 提高CPU的利用率

应用

image-20240414141929635

  • 线程(thread)是一个程序内部的一条执行路径。
  • 我们之前启动程序执行后,main方法的执行其实就是一条单独的执行路径。
public static void main(String[] args) {    
    // 代码…   
    for (int i = 0; i < 10; i++) {        System.out.println(i);    }    
    // 代码...
}

程序中如果只有一条执行路径,那么这个程序就是单线程的程序。

多线程的创建

创建方式一:
  • 定义一个子类继承线程类java.lang.Thread,重写run()方法
  • 创建子类的对象
  • 调用子类对象的start()方法启动线程(底层会自动去执行run方法)

优缺点

  • 优点:编码简单
  • 缺点:存在单继承的局限性,线程类继承Thread后,不能继承其他类,不便于扩展。
  1. 启动线程必须是调用start方法,不是调用run方法。
  2. 不要把主线程任务放在启动子线程之前。
  • 直接调用run方法会当成普通方法执行,此时相当于还是单线程执行。
  • 只有调用start方法才是启动一个新的线程执行。
  • 这样主线程一直是先跑完的,相当于是一个单线程的效果了。
创建方式二: 实现Runnable接口
  • 定义一个线程任务类实现Runnable接口,重写run()方法
  • 创建任务类对象
  • 把任务类对象交给Thread处理
  • public Thread(Runnable target) : 封装Runnable对象成为线程对象
  • 调用线程对象的start()方法启动线程

优缺点:

  • 优点:线程任务类只是实现了Runnale接口,可以继续继承和实现。
    任务类只是实现接口,可以继续继承其他类、实现其他接口,扩展性强。
  • 缺点:如果线程有执行结果是不能直接返回的。需要多一个Runnable对象。
创建方式二的匿名内部类写法

可以创建Runnable的匿名内部类对象。
再交给Thread线程对象。
再调用线程对象的start()启动线程。

前两种方式总结

前两种线程创建方式都存在的一个问题

  • 假如线程执行完毕后有一些数据需要返回,他们重写的run方法均不能直接返回结果。

解决方式

  • JDK 5.0提供了Callable接口和FutureTask类来实现(多线程的第三种创建方式)。
  • 这种方式最大的优点:可以返回线程执行完毕后的结果。
创建方式三:利用Callable接口、FutureTask类来实现
  1. 创建任务对象
    • 定义一个类实现Callable接口,重写call方法,封装要做的事情,和要返回的数据。
    • 把Callable类型的对象封装成FutureTask(线程任务对象)。
  2. 把线程任务对象交给Thread对象。
  3. 调用Thread对象的start方法启动线程。
  4. 线程执行完毕后、通过FutureTask对象的的get方法去获取线程任务执行的结果。

FutureTask的API

FutureTask提供的构造器说明
public FutureTask<>(Callable call)把Callable对象封装成FutureTask对象。
FutureTask提供的方法说明
public V get() throws Exception获取线程执行call方法返回的结果。

优缺点

  • **优点:**线程任务类只是实现接口,可以继续继承类和实现接口,扩展性强;可以在线程执行完毕后去获取线程执行的结果。
  • **缺点:**编码复杂一点。
3种线程方式对比
方式优点缺点
继承Thread类编程比较简单,可以直接使用Thread类中的方法扩展性较差,不能再继承其他的类,不能返回线程执行的结果
实现Runnable接口扩展性强,实现该接口的同时还可以继承其他的类。编程相对复杂,不能返回线程执行的结果
实现Callable接口扩展性强,实现该接口的同时还可以继承其他的类。可以得到线程执行的结果编程相对复杂

Thread的方法

Thread常用方法

方法名称说明
String getName()获取当前线程的名称,默认线程名称是Thread-索引
void setName(String name)设置线程名称
public static Thread currentThread():返回对当前正在执行的线程对象的引用
public static void sleep(long time)让线程休眠指定的时间,单位为毫秒。
public void run()线程任务方法
public void start()线程启动方法
public final void join()…让调用当前这个方法的线程先执行完!

Thread构造器

构造器说明
public Thread(String name)可以为当前线程指定名称
public Thread(Runnable target)把Runnable对象交给线程对象
public Thread(Runnable target ,String name )把Runnable对象交给线程对象,并指定线程名称

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

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

相关文章

【已解决】VMware虚拟机中出现无法将“iso文件”当做CD-ROM映像进行连接:找不到该文件的错误

报错 在VMware上运行虚拟机时报错&#xff1a;VMware虚拟机中出现无法将“iso文件”当做CD-ROM映像进行连接&#xff1a;找不到该文件的错误 原因分析 找不到这个iso文件了&#xff0c;检查文件位置 解决方案 找到iso文件&#xff0c;然后在VM中编辑虚拟机中这个文件的位置…

双塔模型在召回和粗排的区别

答案参考&#xff1a;推荐系统中&#xff0c;双塔模型用于粗排和用于召回的区别有哪些? - 知乎 召回和粗排在不同阶段面临样本不一样&#xff0c;对双塔来说样本分布差异会使召回和粗排采取不一样的方式。召回打分空间是全部item空间&#xff0c;曝光只有很少一部分&#xff0…

IDEA上文件换行符、分隔符(Line Separator)LF,CR,CRLF错乱影响Git上传Github或Gitee代码

IDEA上文件换行符、分隔符(Line Separator)LF&#xff0c;CR&#xff0c;CRLF错乱影响Git上传Github或Gitee代码 指定目录 然后就可以上传了 OK 一定注意更改Line Separator的文件目录 如果是target目录下的文件,是不能修改为LF的,把target文件删除,再重载一次main文件,就…

安装JAVA和java IDEA并汉化过程

1.安装java: 打开java的下载链接&#xff1a; Java Downloads | Oracle 然后选择对应的版本下载即可&#xff0c;我这里是windows 所以下载这个 然后正常一步步安装即可。 2.配置java环境&#xff1a; 在桌面右键此电脑然后点击属性——高级系统设置——环境变量——然后…

揭秘工业大模型:从人工智能小白到技术先锋

工业大模型的五个基本问题 信息化时代&#xff0c;数字化转型成为企业提升营运效率、应对经营风险和提升核心竞争力的重要途径。在此过程中&#xff0c;数据作为一种客观存在的资源&#xff0c;所产生的价值日益凸显。党的十九届四中全会从国家治理体系和治理能力现代化的高度将…

【启扬方案】启扬RK3568核心板助力酒店智能化入住与服务新体验!

近年来&#xff0c;随着人们对于便利和效率的需求不断提升&#xff0c;酒店行业也开始追求智能化的管理方式。酒店无人自助机系统整合了人机交互、人脸识别、智能化控制、语音识别等技术&#xff0c;结合软件应用&#xff0c;房客可以自助完成身份识别、选房、支付、自动发放房…

Hot100-哈希法

1. 两数之和 - 力扣&#xff08;LeetCode&#xff09; 在做面试题目的时候遇到需要判断一个元素是否出现过的场景应该第一时间想到哈希法 class Solution {public int[] twoSum(int[] nums, int target) {int[] result new int[2];for (int i 0; i < nums.length;i){for…

风险防不胜防?看YashanDB如何守护你的数据库安全(下篇)

前言 上一篇文章&#xff0c;咱们主要讲了数据库安全机制中的访问管理~今天继续深入聊聊威胁监测以及数据保护&#x1f9d0; &#xff08;文末可回顾上篇文章噢&#x1f4d6;&#xff09; 02 威胁监测 安全审计 YashanDB语法上支持权限审计、行为审计和角色审计&#xff0c;…

开发规范:API安全

开发规范&#xff1a;API安全 API是现代移动、SaaS和web应用程序的关键组成部分&#xff0c;可以应用在面向客户、合作伙伴和内部应用程序中。API可以暴露应用程序逻辑和敏感数据。不安全的API很容易成为黑客攻击的目标&#xff0c;使他们能够访问安全的服务器或网络。攻击者可…

甘特图是什么?利用甘特图来优化项目管理流程

在现代项目管理中,图表是一种强大而直观的工具,可以帮助项目经理和团队成员清晰地了解并掌控整个项目进程。其中,甘特图是最常用和最有效的图表之一。 甘特图是一种条形图,可以用来直观地展示项目中各个任务的进度、持续时间和相互关系。它由一个横轴和一个纵轴组成。横轴代表时…

Docker搭建LNMP+Wordpress的实验

目录 一、项目的介绍 1、项目需求 2、服务器环境 3、任务需求 二、Linux系统基础镜像 三、部署Nginx 1、建立工作目录 2、编写Dockerfile 3、准备nginx.conf配置文件 4、设置自定义网段和创建镜像和容器 5、启动镜像容器 6、验证nginx 三、Mysql 1、建立工作目录…

Vue集成three.js,加载glb、gltf类型的3d模型

安装基本依赖 // 注意OrbitControls要加{}&#xff0c;注意路径是jsm import { OrbitControls } from ‘three/examples/jsm/controls/OrbitControls.js’; // import { dat } from ‘three/examples/jsm/controls/dat.gui.js’; // dat gui这个插件&#xff0c;是另外自己下载…

CentOS命令大全:掌握关键命令及其精妙用法!

CentOS是一种流行的开源企业级Linux发行版&#xff0c;它基于Red Hat Enterprise Linux (RHEL)的源代码构建。对于系统管理员和运维工程师来说&#xff0c;掌握CentOS的常用命令至关重要。 这些命令不仅可以帮助管理服务器&#xff0c;还可以进行故障排查、性能监控和安全加固等…

面试官:素有Java锁王称号的‘StampedLock’你知道吗?我:这什么鬼?

一、写在开头 我们在上一篇写ReentrantReadWriteLock读写锁的末尾留了一个小坑&#xff0c;那就是读写锁因为写锁的悲观性&#xff0c;会导致 “写饥饿”&#xff0c;这样一来会大大的降低读写效率&#xff0c;而今天我们就来将此坑填之&#xff01;填坑工具为&#xff1a;Stam…

牛客NC99 多叉树的直径【较难 深度优先 Java/Go/PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/a77b4f3d84bf4a7891519ffee9376df3 思路 核心就是树的最大直径(globalMax)一定是以某一个node为root最长的两个path-to-leaf. 就是普通dfs的同时算路径长度。时间: O(n), DFS一次 空间: O(n)参考答案Java impo…

制作一个RISC-V的操作系统十四-任务同步和锁

文章目录 并发与同步临界区和锁锁死锁解决死锁自旋锁&#xff08;spin lock&#xff09;原子性问题原子操作实现amoswap.w.aq例子 另一种方法自旋锁的注意事项代码其他同步技术 并发与同步 控制流&#xff1a;可理解为任务或进程 中断也可以理解为一个切换到另一个任务&#…

Webpack-入门

定义 静态模块&#xff1a;指的是编写代码过程中的html&#xff0c;css&#xff0c;js&#xff0c;图片等固定内容的文件 打包&#xff1a;把静态模块内容压缩、整合、翻译等&#xff08;前端工程化&#xff09; 1&#xff09;把less/sass转成css代码 2&#xff09;把ES6降级…

C语言-用二分法在一个有序数组中查找某个数字

1.题目描述 有15个数按由大到小顺序放在一个数组中&#xff0c;输入一个数&#xff0c;要求用折半查找法找出该数是数组中第几个元素的值。如果该数不在数组中&#xff0c;则输出“无此数” 二.思路分析 记录数组中左边第一个元素的下标为left&#xff0c;记录数组右边第一个…

GaussianCube:使用最优传输构造高斯溅射用于3D生成建模

GaussianCube: Structuring Gaussian Splatting using Optimal Transport for 3D Generative Modeling GaussianCube&#xff1a;使用最优传输构造高斯溅射用于3D生成建模 Bowen Zhang1⁣*    Yiji Cheng2⁣*   Jiaolong Yang3   Chunyu Wang3 张博文 1⁣* 程一季 2⁣* …

10.shell数组

shell数组 数组基本概述什么是数组数组的分类普通数组关联数组 数组的遍历与循环案例1:案例2:案例3:案例4: 数组基本概述 什么是数组 数组其实也算是变量&#xff0c;传统的变量只能存一个值&#xff0c;但是数组可以存多个值。 实际使用中主要通过for循环遍历数组中的数据 …