特殊文件
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中有特殊的转义序列
< <
> >
& &
' '
" "
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的步骤如下:
- 下载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接⼝。简单来说属于⽇志规范
-
将库⽂件添加到项⽬中:将下载的库⽂件添加到你的项⽬中。你可以将它们放在项⽬的lib⽬录下.
-
创建logback.xml⽂件:在项⽬的资源⽬录下创建⼀个名为logback.xml的⽂件。logback.xml是
Logback的配置⽂件,你可以在其中定义⽇志记录器、⽇志输出格式、⽇志级别等。(⽼师已提供)
- 在代码中使⽤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>