java:特殊文件(properties,xml)和日志

特殊文件

txt(文本文件)

txt文件是一种纯文本文件,用于存储文本信息

优缺点:txt文件简单易用,可以使用任何文本编辑器打开和编辑,但不支持数据类型和结构,所有信息均用纯文本形式保存

适合简单的配置信息存储

请添加图片描述

properties文件

properties文件是一种键值对文件,用于存储配置信息

优缺点:properties文件支持数据类型和注释,可以使用属性文件加载器加载和解析

相比txt文件,properties文件更加灵活,但仍然不支持嵌套和复杂结构

适用于键值对的配置信息存储

请添加图片描述

xml文件

xml文件是一种可扩展的标记语言,用于存储配置信息和数据,也可以作为信息进行传输

优缺点:xml文件支持复杂的数据结构和嵌套,提供了更多标签和属性来描述数据,同时支持Xpath查询和解析

但xml文件的编写和解析需要一定学习成本

适用于复杂的配置信息和数据存储

请添加图片描述

properties文件应用

java中的一种配置文件,用于存储键值对的属性.

以properties扩展名进行存储,可以使用Properties双列集合类来读写这种文件

主要用于存储应用程序的配置信息

eg:数据库连接参数,界面显示语言,文件路径

通过读取properties文件,应用程序可以根据不同的环境或者用户需求来动态加载配置信息

Properties双列集合类

HashTable的一个子类,一种map集合

不能添加泛型,默认为Object

集合中一般只添加字符串

构造器
public Properties()
//用于构建Properties集合对象(空容器)
常用方法
public void load(InputStream is)
//通过字节输入流,读取属性文件中的键值对数据
public void load(Reader reader)
//通过字符输入流,读取属性文件中的键值对数据
public String getProperty(String key)
//根据键获取值(其实就是get方法的效果)
public Set<String> stringPropertyNames()
//获取全部键的集合==keyset方法效果
//返回的是一个String泛型的Set集合
读取文件数据
public Object setProperty(String key,String value)
//保存键值对数据到Properties对象
public void store(OutputStream os,String comments)
//把键值对数据,通过字节输出流写出到属性文件里
public void store(Writer w,String comments)
//把键值对数据通过字符输出流写出到属性文件中
//comments参数传入的是对properties文件的注释,一般写一些解释和说明,默认使用Unicode编码

XML

可扩展标记语言,标签名可以自定义设计

一种用于存储和传输数据的标记语言.

用于存储配置信息和数据,也可以在不同系统和平台间数据交换和共享

XML语法规则

1,所有XML元素(标签)必须有一个开始和结束标签,且开始结束标签必须匹配

2,XML元素可以包含其他元素或者文本内容

3,XML标签对大小写敏感

4,XML元素必须正确嵌套,即两个元素必须在同一级下

5,XML属性必须在开始标签中,且由空格分隔

6,XML注释以<!--开始,-->结束

7,特殊字符(如<,>,&,"和’)在XML中有特殊的转义序列

&lt; <
&gt; >
&amp; &
&apos; '
&quot; "

8,xml文件的第一行第一列必须要写xml的一些配置属性

<?xml version = "1.0" encoding = "UTF-8"?>

9,可以通过

<![CDATA[内容]]

语法将所有内容直接以文本解析,无需使用转义字符

XML文件应用-解析

将XML文档中的数据解析出来,以便于程序读取和处理

DOM解析
将整个XML文档加载到内存,

构建一个树形结构的文档对象,适合对整个文档进行频繁读取修改和查询

效率高,但对内存占用高
SAX解析

基于事件驱动的解析方式,

逐行读取XML文档,

只在需要时才触发,适合对大型XML文件进行快速的顺序读取操作

效率相对不高,但是对大型文件效果更好
通过Dom4j(Dom for java)框架进行解析
SAXReader reader = new SAXReader();
//创建SAXReader对象(Dom4j库中用于解析XML的核心类)

Document document = reader.read(new File(path));
//读取XML文件,解析为Document对象

Element rootElement = document.getRootElement();
//获取根元素,通过Document对象的getRootElement()方法获取XML文档的根元素

List<Element> childElements = rootElement.elements()
//通过Element对象的elements()方法获取所有子元素List
List<Element> childElements = rootElement.elements(String str)
//通过Element对象的elements()方法获取所有标签为str的子元素List

for(Element childELement:childElements){
	//对子元素进行处理
}

String attributeValue = childElement.attributeValue(元素)
//获取元素的属性值
Element element = childElement.element(str)
//获取标签为str的子标签
String text = childElement.getText()//获取文本

XML文件约束

专门限制XML书写格式的文档

DTD约束:

一种基于文本的约束语言,定义了XML文件的元素,属性,实体和其他结构的规则.

DTD使用一系列的声明描述XML文档的结构.

eg:元素的名称,类型,数量,顺序等

DTD通常以一个独立的DTD文件形式存在,然后在XML文件中通过DOCTYPE声明引用.

创建.dtd文件固定属性和名称

eg:

<!Element 书架(书+)>//根标签为书架,子元素书出现一次或多次
<!Element 书(书名,作者,售价)//规定子元素名称
<!Element 书名(#PCDATA)>//规定子元素内容的类型(字符串)
导入约束
<!DOCTYPE 书架 SYSTEM(PUBLIC) "dtd文件路径">//令根元素书架遵循dtd文件的规定,SYSTEM代表本地,PUBLIC代表网络上的
Schema约束:

是一种基于XML的约束语言,提供更强大和灵活的约束能力.

与DTD不同,schema使用XML语法本身来定义XML文档的结构和数据类型.

Schema可以定义元素,属性,复杂类型(序列,选择,重复等…),数据类型(整数,字符串,日期等)以及约束规则(如唯一性,键值关联和数据范围等).

通常以一个独立的XSD文件形式存在,然后在XML文件中通过命名空间引用.

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://www.example.org/book" 
    //命名空间
    xmlns:tns="http://www.example.org/book"
   	//名称空间标识URL
    elementFormDefault="qualified">
    <element name="书架">
        <complexType>
            <sequence>
                <element name="">
                    <complexType>
                        <sequence>
                            <element name="书名" type="string" />
                            <element name="售价" type="double" />
                        </sequence>
                    </complexType>
                </element>
            </sequence>
        </complexType>
    </element>
</schema>

<?xml version="1.0" encoding="UTF-8"?>
<person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        //代表是一个被约束文件
		xmlns="http://www.baidu.com/20220408"
        //约束文档里的命名空间
		xsi:schemaLocation="http://www.baidu.com/20220408 schema_test.xsd" id = "001">
    	//约束文档里的命名空间和约束文档的地址路径
		<name>ss</name>
		<age>20</age>
		<adress>ssss</adress>
</person>

总结

schema比DTD有更强大和灵活的约束能力,可以提供更精确的数据类型定义和更复杂的数据结构描述.

日志

一种用于记录应用程序运行状态和错误信息的工具.

可以帮助开发人员在应用程序中添加日志语句,以便在程序运行过程中查看和分析日志信息.

输出语句和日志技术的对比

输出语句

输出到控制台,取消输出需要修改代码灵活性较差

日志

可以将日志信息写入到文件和数据库中,不需要修改代码,灵活性比较好

Java日志的用途

调试

在开发过程中,可以使用日志跟踪代码执行路径,查找错误和异常的原因,验证代码的逻辑正确性.

运行监控

通过记录关键信息,可以监控和分析程序的运行状态

eg:记录请求的处理时间和访问频率等

故障排查

程序出现问题时,可以查看日志定位问题所在,快速排查故障并修复

常见Java日志框架

log4j

一个功能强大的日志框架,

支持灵活的日志级别,日志输出格式和日志记录目标

logback

log4j的继任者,提供更好的性能和可靠性,同时支持log4j的配置文件

java.util.logging

java自带的日志框架,提供一套简单易用的日志API

Java框架

相当于房子的毛坯,程序员基于框架的半成品进行搭建,完成不同的项目.

日志应用-Logback

一个Java日志框架,log4j项目的升级版.

Logback具有高性能和灵活性,可以用于各种Java应用程序和框架

Logback的步骤如下:

  1. 下载Logback库⽂件:在Logback的官⽅⽹站(http://logback.qos.ch/)上下载Logback的库⽂

件。需要下载logback-core.jar、logback-classic.jar和slf4j-api.jar三个jar包

◦ logback-core.jar提供了Logback框架的核⼼功能

◦ logback-classic.jar是对logback-core.jar进⾏功能扩展并提供了与log4j兼容的API。

◦ slf4j-api.jar是SLF4J规范的实现,它提供了统⼀的⽇志API接⼝。简单来说属于⽇志规范

  1. 将库⽂件添加到项⽬中:将下载的库⽂件添加到你的项⽬中。你可以将它们放在项⽬的lib⽬录下.

  2. 创建logback.xml⽂件:在项⽬的资源⽬录下创建⼀个名为logback.xml的⽂件。logback.xml是

Logback的配置⽂件,你可以在其中定义⽇志记录器、⽇志输出格式、⽇志级别等。(⽼师已提供)

  1. 在代码中使⽤Logback:通过调⽤LoggerFactory.getLogger(类的字节码/类名)⽅法获取⼀个

Logger实例,然后使⽤该实例记录⽇志。

 private static final Logger LOGGER = LoggerFactory.getLogger("Test");
//导包
//创建Logger类型对象
//使用LoggerFactory.getLogger("类名")获取对象

Logback日志级别

用来控制日志输出的详细程度的设置,通过设置日志级别,可以决定哪些日志消息会被输出,哪些会被忽略.

分为以下几个级别:

TRACE(追踪):

最详细的日志级别,用于跟踪代码的执行路径.

在生产环境中一般不使用该级别

DEBUG(调试):

用于调试代码时打印详细信息

eg:方法的输入参数,变量的值等

在生产环境中一般不使用该级别

INFO(信息):

用于打印程序运行时的一些重要信息

eg:程序的启动和关闭

可以帮助我们了解程序的运行情况(常用)

WARN(警告):

用于打印一些可能会导致程序出现问题的警告信息

eg:数据库连接超时,磁盘空间不足等

可以提醒我们注意可能存在的问题

ERROR(错误):

用于打印一些严重的错误信息

eg:程序崩溃,无法连接数据库等

可以帮助我们快速定位问题并进行修复(常用)

OFF(关闭)

一个特殊的级别,表示关闭日志记录

日志的输出结果

控制台打印

配置文件修改

<appender name="CONSOLE" class="">
	<target>System.out</target>
	<encoder>
		<pattern>
		%d{yyyy-MM-dd HH:mm:ss.SSS}[%-5level]%c%logger{36}[%Thread]:%msg%n
		</pattern>
	</encoder>
</appender>

请添加图片描述

文件打印

配置文件修改

<appender name="FILE" class="">
	<target>System.out</target>
	<encoder>
		<pattern>
		%d{yyyy-MM-dd HH:mm:ss.SSS}[%-5level]%c%logger{36}[%Thread]:%msg%n
		</pattern>
	</encoder>
    <file>日志输出路径</file>
    设置日志滚动的策略
    ch.qos.logback.core.rolling.RollingFileAppender代表按时间滚动
    <rollingPolicy 		class="ch.qos.logback.core.rolling.RollingFileAppender">
        <fileNamePattern>
        	指定压缩文件名称
        </fileNamePattern>
        <maxFileSize>
        	1MB文件达到多大时会被压缩
        </maxFileSize>
    </rollingPolicy>
</appender>

%d{时间格式}

-n取信息中的n位

%level日志等级

%c类名

%logger{最大字符长度}

%msg日志信息

%n换行符

日志过滤

配置文件修改

<root level="⽇志级别">//只保留日志级别及以上的日志,全部保留用ALL
<!--控制台位置被⽇志级别控制-->
<appender-ref ref="CONSOLE"/>
<!--⽂件位置被⽇志级别控制-->
<appender-ref ref="FILE"/>
</root>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024最新在线工具箱网站系统源码

2024最新在线工具箱网站系统源码 下载地址: 2024最新在线工具箱网站系统源码-JXASP源码网https://www.jxasp.com/think-php/12489.html

数据库世界信息速递-- TIDB 怎么走向世界如何保证稳定性和可靠性(译)

开头还是介绍一下群&#xff0c;如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis, Oceanbase, Sql Server等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;&#xff08;…

LeetCode刷题记(三):61~90题

61. 旋转链表 给你一个链表的头节点 head &#xff0c;旋转链表&#xff0c;将链表每个节点向右移动 k 个位置。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], k 2 输出&#xff1a;[4,5,1,2,3]示例 2&#xff1a; 输入&#xff1a;head [0,1,2], k 4 输出&…

C#.net手术麻醉信息系统源码,集成HIS、EMR、LIS、PACS系统

手术麻醉信息系统可以实现手术室监护仪、麻醉机、呼吸机、输液泵等设备输出数据的自动采集&#xff0c;采集的数据能据如实准确地反映患者生命体征参数的变化&#xff0c;并实现信息高度共享&#xff0c;根据采集结果&#xff0c;综合其他患者数据&#xff0c;自动生成手术麻醉…

JavaScript教程(十四)--- 类型化数组

JavaScript 类型化数组 JavaScript 类型化数组是一种类似数组的对象&#xff0c;并提供了一种用于在内存缓冲中访问原始二进制数据的机制。 引入类型化数组并非是为了取代 JavaScript 中数组的任何一种功能。相反&#xff0c;它为开发者提供了一个操作二进制数据的接口。这在操…

SAP软件如何批量修改物料主数据

在SAP/ERP系统日常运维中经常会遇到批量修改物料主数据的业务需求&#xff0c; 遇到这种业务需求可以使用SAP提供的标准的事务代码MM17进行处理。 下面按业务场景介绍下具体的操作步骤 业务场景1 需要将一批物料主数据的采购组字段全部修改为002。 具体操作步骤如下&#…

[漏洞复现]D-Link未授权RCE漏洞复现(CVE-2024-3273)

声明&#xff1a;亲爱的读者&#xff0c;我们诚挚地提醒您&#xff0c;Aniya网络安全的技术文章仅供个人研究学习参考。任何因传播或利用本实验室提供的信息而造成的直接或间接后果及损失&#xff0c;均由使用者自行承担责任。Aniya网络安全及作者对此概不负责。如有侵权&#…

Spring+SpringMVC的知识总结

一:技术体系架构二:SpringFramework介绍三:Spring loC容器和核心概念3.1 组件和组件管理的概念3.1.1什么是组件:3.1.2:我们的期待3.1.3Spring充当组件管理角色(IOC)3.1.4 Spring优势3.2 Spring Ioc容器和容器实现3.2.1普通和复杂容器3.2.2 SpringIOC的容器介绍3.2.3 Spring IOC…

L1-027 出租

下面是新浪微博上曾经很火的一张图&#xff1a; 一时间网上一片求救声&#xff0c;急问这个怎么破。其实这段代码很简单&#xff0c;index数组就是arr数组的下标&#xff0c;index[0]2 对应 arr[2]1&#xff0c;index[1]0 对应 arr[0]8&#xff0c;index[2]3 对应 arr[3]0&…

30、链表-两两交换链表

思路&#xff1a; 放入集合中两两交换&#xff0c;然后再重新构建链表可以解决。但是不是最优方案 第二种方式如下&#xff1a; 代码如下&#xff1a; public ListNode swapPairs(ListNode head) {if (headnull||head.nextnull){return head;}ListNode dummy new ListNode(…

麒麟服务器操作系统安装DHCP服务02

原文链接&#xff1a;麒麟服务器操作系统安装DHCP服务02 Hello&#xff0c;大家好啊&#xff01;继昨天介绍了在麒麟服务器操作系统上部署DHCP服务并演示了终端自动获取IP地址的过程之后&#xff0c;今天我们将进一步探讨如何通过绑定终端的MAC地址来为其分配固定的IP地址。这种…

第四十八周:文献阅读

目录 摘要 Abstract 文献阅读&#xff1a;时间序列预测的傅里叶图卷积网络 现有问题 提出方法 方法论 傅里叶级数 图信号的傅里叶变换 论文方法&#xff1a;F-GCN&#xff08;傅立叶图卷积网络&#xff09; 数据构建 傅立叶嵌入模块 时空ChebyNet层 框架伪代码 研…

七、Yocto使用systemd设置开机自启动程序

文章目录 Yocto使用systemd设置开机自启动程序一、 systemd介绍及service设置二、yocto集成 Yocto使用systemd设置开机自启动程序 本篇文章为基于raspberrypi 4B单板的yocto实战系列的第七篇文章&#xff1a; 一、yocto 编译raspberrypi 4B并启动 二、yocto 集成ros2(基于rasp…

人工智能轨道交通行业周刊-第77期(2024.4.1-4.14)

本期关键词&#xff1a;货车巡检机器人、铁路安全技防、车辆换长、阿里千问、大模型创业 1 整理涉及公众号名单 1.1 行业类 RT轨道交通人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网铁路视点ITS World轨道交通联盟VSTR铁路与城市轨道交通RailMetro轨道世界…

宝妈如何在家创造收入?五种兼职工作让你轻松赚钱!

许多宝妈为了陪伴孩子成长&#xff0c;毅然选择了全职妈妈的角色&#xff0c;然而&#xff0c;她们内心仍希望能有一份收入&#xff0c;实现经济独立。于是&#xff0c;寻找既能照顾家庭又能赚钱的工作成了她们的迫切需求。 然而&#xff0c;这样的需求也往往让宝妈们成为一些…

鸿蒙语言TypeScript学习第16天:【类】

1、TypeScript 类 TypeScript 是面向对象的 JavaScript。 类描述了所创建的对象共同的属性和方法。 TypeScript 支持面向对象的所有特性&#xff0c;比如 类、接口等。 TypeScript 类定义方式如下&#xff1a; class class_name { // 类作用域 }定义类的关键字为 class&am…

《自动机理论、语言和计算导论》阅读笔记:p139-p171

《自动机理论、语言和计算导论》学习第 7 天&#xff0c;p139-p171总结&#xff0c;总计 33 页。 一、技术总结 1.reversal p139, The reversal of a string a1a2…an is the string written backwards, that is anan-1…a1. 2.homomorphism A string homomorphism is a f…

原理图添加封装

双击器件选中》右边弹出Properties》点击添加封装Footprint 找到你想要的封装&#xff0c;确定即可。

算法设计与分析实验报告c++实现(生命游戏、带锁的门、三壶谜题、串匹配问题、交替放置的碟子)

一、实验目的 1&#xff0e;加深学生对分治法算法设计方法的基本思想、基本步骤、基本方法的理解与掌握&#xff1b; 2&#xff0e;提高学生利用课堂所学知识解决实际问题的能力&#xff1b; 3&#xff0e;提高学生综合应用所学知识解决实际问题的能力。 二、实验任务 1、 编…

Java多线程学习总结

在Java中&#xff0c;多线程编程是一种重要的编程模型&#xff0c;它允许程序同时执行多个任务&#xff0c;从而提高了程序的执行效率和响应速度。 一、基本概念 进程与线程&#xff1a;进程是系统分配资源的基本单位&#xff0c;它包含了程序执行所需的资源&#xff0c;如代码…