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的子元素Listfor(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"//名称空间标识URLelementFormDefault="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>

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】账号和权限管理

目录 一、用户账号与组账号 二、添加用户账号-useradd 三、修改用户账号的属性-usermod 四、更改用户命令-passwd 五、删除用户账号-userdel 六、添加组账号-groupadd 七、添加删除组成员-gpasswd 八、删除组账号-groupdel 九、查询账号信息-groups、id、finger、w、w…

分享一款免费阅读的软件:Legado,已免费开源(文末有福利)

对于喜欢阅读的人来说&#xff0c;一定经历过从一本厚厚的修仙书籍到MP3、MP4的阅读时代&#xff0c;再到现今的手机软件。 但是现在的阅读软件经常会遇见以下问题&#xff1a;比如广告弹窗太多&#xff0c;排版乱&#xff0c;甚至很多的APP都进入会员时代&#xff0c;再加上一…

28、链表-两数相加

思路&#xff1a; 有几个方面需要考虑 双指针遍历&#xff0c;如果出现和大于10那么向前进1如果长度不一样那么长的部分直接落下并且考虑进1 的问题 代码如下&#xff1a; class Solution {public ListNode addTwoNumbers(ListNode l1, ListNode l2) {if (l1null||l2null){…

鸿蒙端云一体化开发--开发云函数--适合小白体制

开发云函数 那什么是云函数&#xff1f;我们将来又怎么去使用这个云函数呢&#xff1f; 答&#xff1a;我们之前要编写一些服务端的业务逻辑代码&#xff0c;那现在&#xff0c;在这种端云一体化的开发模式下&#xff0c;我们是把服务端的业务逻辑代码&#xff0c;通过云函数来…

NVM下载和安装NodeJS教程

nvm文档手册 - nvm是一个nodejs版本管理工具 - nvm中文网 官网下载nvm&#xff0c;选择版本 打开nvm文件夹下的settings.txt文件&#xff0c;在最后添加以下代码&#xff1a; node_mirror: https://npm.taobao.org/mirrors/node/ npm_mirror: https://npm.taobao.org/mirrors…

973: 统计利用先序遍历创建的二叉树叶结点的个数

解法&#xff1a; #include<iostream> #include<queue> using namespace std; // 定义二叉树结点 struct TreeNode {char val;TreeNode* left;TreeNode* right;TreeNode(char x) :val(x), left(NULL), right(NULL) {}; }; // 先序递归遍历建立二叉树 TreeNode* bu…

全局代理导致JetBrains IDE CPU占用高,jdk.internal.net.http.common

GoLand版本&#xff1a;2022.3.4 解决办法&#xff1a; 使用SOCKS代理代替HTTP代理 禁用Space和Code With Me插件 禁用 TLS V1.3&#xff0c;参考&#xff1a;https://stackoverflow.com/questions/54485755/java-11-httpclient-leads-to-endless-ssl-loop 参考 https://…

linux查看硬盘空间使用情况

df &#xff08;1&#xff09;查看磁盘空间的占用情况 -h是给大小带上单位 df -h 总空间不一定等于已用未用&#xff0c;系统可能留出来一点空间另做他用 &#xff08;2&#xff09;查看INode的使用情况 df -idu du命令比df命令复杂一点&#xff0c;是查看文件和目录占用的…

基于JSP的教务管理

摘要 随着现代技术的不断发展&#xff0c;计算机已经深度的应用到了当下的各个行业之中&#xff0c;教育行业也不例外。计算机对教育行业中的教务管理等内容的帮助&#xff0c;使得教职工从传统的手工办公像计算机辅助阶段迈进&#xff0c;并且实现了非常好的发展。现在的学校…

【自研网关系列】请求服务模块和客户端模块实现

&#x1f308;Yu-Gateway&#xff1a;&#xff1a;基于 Netty 构建的自研 API 网关&#xff0c;采用 Java 原生实现&#xff0c;整合 Nacos 作为注册配置中心。其设计目标是为微服务架构提供高性能、可扩展的统一入口和基础设施&#xff0c;承载请求路由、安全控制、流量治理等…

传送指令三菱

1&#xff0c;mov指令表示接通后一直传送 2&#xff0c;movP 接通后只传送一次 3&#xff0c;DMOV 32位传送 1&#xff0c; m0 接通 执行一次写入 值改变了 2&#xff0c;m1 接通 执行写入 值变为6 断开M1 值未发生变化 断开M0 在执行写入 值变为5 dmov 32 位 mov 16位 实…

基于物理原理的p-GaN HEMT动态导通电阻SPICE建模

来源&#xff1a;Physics-Based SPICE Modeling of Dynamic ON-State Resistance of p-GaN HEMTs&#xff08;TPEL 23年&#xff09; 摘要 这封快报介绍了一种新型基于物理学原理的SPICE建模方法&#xff0c;专门针对氮化镓基p型门极高电子迁移率晶体管&#xff08;p-GaN HEM…