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

集合中一般只添加字符串

构造器
java 复制代码
public Properties()
//用于构建Properties集合对象(空容器)
常用方法
java 复制代码
public void load(InputStream is)
//通过字节输入流,读取属性文件中的键值对数据
public void load(Reader reader)
//通过字符输入流,读取属性文件中的键值对数据
public String getProperty(String key)
//根据键获取值(其实就是get方法的效果)
public Set<String> stringPropertyNames()
//获取全部键的集合==keyset方法效果
//返回的是一个String泛型的Set集合
读取文件数据
java 复制代码
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属性必须在开始标签中,且由空格分隔

java 复制代码
6,XML注释以<!--开始,以-->结束

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

xml 复制代码
&lt; <
&gt; >
&amp; &
' '
&quot; "

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

xml 复制代码
<?xml version = "1.0" encoding = "UTF-8"?>

9,可以通过

xml 复制代码
<![CDATA[内容]]

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

XML文件应用-解析

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

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

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

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

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

逐行读取XML文档,

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

效率相对不高,但是对大型文件效果更好
通过Dom4j(Dom for java)框架进行解析
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:

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

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

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

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

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

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 复制代码
<?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实例,然后使⽤该实例记录⽇志。

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

Logback日志级别

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

分为以下几个级别:

TRACE(追踪):

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

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

DEBUG(调试):

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

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

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

INFO(信息):

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

eg:程序的启动和关闭

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

WARN(警告):

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

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

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

ERROR(错误):

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

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

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

OFF(关闭)

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

日志的输出结果

控制台打印

配置文件修改

xml 复制代码
<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>
文件打印

配置文件修改

xml 复制代码
<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换行符

日志过滤

配置文件修改

xml 复制代码
<root level="⽇志级别">//只保留日志级别及以上的日志,全部保留用ALL
<!--控制台位置被⽇志级别控制-->
<appender-ref ref="CONSOLE"/>
<!--⽂件位置被⽇志级别控制-->
<appender-ref ref="FILE"/>
</root>
相关推荐
禁默2 分钟前
深入浅出:AWT的基本组件及其应用
java·开发语言·界面编程
Cachel wood9 分钟前
python round四舍五入和decimal库精确四舍五入
java·linux·前端·数据库·vue.js·python·前端框架
Code哈哈笑11 分钟前
【Java 学习】深度剖析Java多态:从向上转型到向下转型,解锁动态绑定的奥秘,让代码更优雅灵活
java·开发语言·学习
終不似少年遊*14 分钟前
pyecharts
python·信息可视化·数据分析·学习笔记·pyecharts·使用技巧
gb421528714 分钟前
springboot中Jackson库和jsonpath库的区别和联系。
java·spring boot·后端
程序猿进阶15 分钟前
深入解析 Spring WebFlux:原理与应用
java·开发语言·后端·spring·面试·架构·springboot
Python之栈16 分钟前
【无标题】
数据库·python·mysql
zfoo-framework22 分钟前
【jenkins插件】
java
风_流沙28 分钟前
java 对ElasticSearch数据库操作封装工具类(对你是否适用嘞)
java·数据库·elasticsearch