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>
相关推荐
Amo Xiang2 小时前
《100天精通Python——基础篇 2025 第18天:正则表达式入门实战,解锁字符串处理的魔法力量》
python·正则表达式·re
敲键盘的小夜猫3 小时前
Python核心数据类型全解析:字符串、列表、元组、字典与集合
开发语言·python
apcipot_rain4 小时前
【应用密码学】实验五 公钥密码2——ECC
前端·数据库·python
小彭律师4 小时前
门禁人脸识别系统详细技术文档
笔记·python
鸿业远图科技5 小时前
分式注记种表达方式arcgis
python·arcgis
别让别人觉得你做不到6 小时前
Python(1) 做一个随机数的游戏
python
小彭律师7 小时前
人脸识别门禁系统技术文档
python
熊大如如7 小时前
Java 反射
java·开发语言
猿来入此小猿7 小时前
基于SSM实现的健身房系统功能实现十六
java·毕业设计·ssm·毕业源码·免费学习·猿来入此·健身平台