Java基础12-特殊文件和日志技术
十二、特殊文件和日志技术
1、特殊文件
properties:用来存储键值对数据。
xml:用来存储有关系的数据。
1.1 properties文件
特点:存储键值对,键不能重复,文件后缀一般是.properties结尾的。
properties:是一个Map集合,但是一般不能用来当集合使用。
核心作用: Properties是用来代表属性文件的,通过Properties 可以读写属性文件里的内容。

| 构造器 | 说明 |
|---|---|
| public Properties() | 用于构建Properties集合对象(空容器) |
| 使用Properties读取键值对数据常用方法 | 说明 |
|---|---|
| public void load( InputStream is ) | 通过字节输入流,读取属性文件里的键值对数据 |
| public void load( Reader reader ) | 通过字符输入流,读取属性文件里的键值对数据 |
| public String getProperty( String key ) | 根据键获取值(其实就是get方法的效果) |
| public Set stringPropertyNames() | 获取全部键的集合(其实就是ketSet方法的效果) |

public class PropertiesTest {public static void main(String[] args) throws Exception {Properties properties=new Properties();properties.load(new FileReader("object-app\\src\\akc4\\SpecialFile\\abc.properties"));//根据健来获取值System.out.println(properties); //{password=123, name=root}String name=properties.getProperty("name");String password=properties.getProperty("password");System.out.println(name); //rootSystem.out.println(password); //123//获取全部键存到set集合里面去Set<String> keys= properties.stringPropertyNames();//遍历所有内容for (String key:keys) {String value=properties.getProperty(key);System.out.println(key+"----->"+value);// password----->123//name----->root}}
}
| 使用Properties写入键值对数据常用方法 | 说明 |
|---|---|
| public Object setProperty(String key , String value) | 保存键值对数据到Properties对象中去。 |
| public void store(OutputStream os , String comments ) | 把键值对数据,通过字节输出流写出到属性文件里去 |
| public void store( Writer w ,String comments ) | 把键值对数据,通过字符输出流写出到属性文件里去 |
public class PropertiesTest {public static void main(String[] args) throws Exception {Properties properties=new Properties();//将键值对数据先保存到properties对象中去properties.setProperty("小明","54321");properties.setProperty("小花","1234");properties.setProperty("红红","5555");System.out.println(properties);//将对象数据保存到properties文件中去,如果没有该文件会自动创建。参数:(字节或字符输出流,注释)properties.store(new FileWriter("object-app\\src\\akc4\\SpecialFile\\123.properties"),"用户名和密码");}
}
1.1.2 例题
有一个info.txt文件,里面包含键值对:小明=12,小花=18,小罗=19,小天=20,判断里面是否有小罗,如果有,将值改为18。

public class PropertiesTest {public static void main(String[] args) throws Exception {//创建一个properties对象Properties properties=new Properties();//将文件加载到项目中来properties.load(new FileReader("object-app\\src\\akc4\\SpecialFile\\info.txt"));//因为Properties是Map中的集合,所有可通过Map提供的方法containKey方法来进行判断健是否存在。if (properties.containsKey("小罗")){//存在,将properties对象中,小罗的值进行替换properties.setProperty("小罗","18");//将对象的新值写入到对应文件中去properties.store(new FileWriter("object-app\\src\\akc4\\SpecialFile\\info.txt"),"姓名和年龄");System.out.println("修改成功!");}else{System.out.println("小罗不存在!");}}
}
1.2 XML 可扩展标记语言
作用:本质是一种数据格式,可以存储复杂的数据结构,和数据关系。
应用场景:经常用来做为系统的配置文件;或者作为-种特殊的数据结构,在网络中进行传输。格式如下:
<!--开头必须是固定的格式-->
<?xml version="1.0" encoding="UTF-8" ?><!--只有一个根标签-->
<users><user id="1"><name>小明</name><sex>男</sex><地址>四川</地址></user><user id="2"><name>小花</name><sex>女</sex><地址>四川</地址></user>
</users>
在XML中,需要转义的字符有:
& &
< <
> >
" "
' '
也可以输入CD,再回车,就会出现 <![CDATA[ ]]>,在中括号里就可以输入任意字符了。
1.2.1 DOM4J解析库
下载链接:https://dom4j.github.io/

DOM4J解析XML-得到Document对象
SAXReader: Dom4j提供的解析器,可以认为是代表整个Dom4j框架
| 构造器/方法 | 说明 |
|---|---|
| public SAXReader() | 构建DOM4J的解析器对象 |
| public Document read(String url ) | 把XML文件读成Document对象 |
| public Document read(InputStream is) | 通过字节输入流读取XML文件 |
| 方法名 | 说明 |
|---|---|
| Element getRootElement() | 获得根元素对象 |
| 通过根元素能调用的元素方法获取xml里面的内容 | 说明 |
|---|---|
| public String getName()( | 获取元素名字 |
| public List elements() | 获取当前元素下所有的子元素 |
| public List elements( String name ) | 获取当前元素下指定的名字的子元素返回集合 |
| public Element element ( String name ) | 得到当前元素下指定名字的子元素,如果有多个名字相同的返回第一个 |
| public String attributeValue ( String name ) | 通过属性名直接得到属性值 |
| public String elementText(子元素名) | 获取指定名称的子元素的文本 |
| public String getText() | 获取文本 |
public class Dom4jInputTest {public static void main(String[] args) throws Exception {//创建一个saxReader对象SAXReader saxReader=new SAXReader();//将xml文件读成Document对象Document document= saxReader.read("object-app\\src\\akc4\\xmlDir\\info.xml");//通过Document对象调用方法读取根以元素Element rootElement=document.getRootElement();//获取元素名System.out.println(rootElement.getName());//users//获取根元素下第一个元素为user的元素,再获取元素对应的id属性值String id1=rootElement.element("user").attributeValue("id");System.out.println(id1); //1//获取根元素下第一元素为user的元素,再向下的name元素,获取其对应的文本String name=rootElement.element("user").element("name").getText();System.out.println(name); //小明//获取根元素下的所有元素存放到list集合中List<Element> listElements=rootElement.elements();//遍历xml中所有人的个人信息for (Element listElemnt: listElements) {System.out.println("----------------------------");System.out.println(listElemnt.element("name").getText());System.out.println(listElemnt.element("sex").getText());System.out.println(listElemnt.element("地址").getText());}}
}
写出XML数据:推荐直接把程序里的数据拼接成XML格式,然后用IO流写出去!
1、通过StringBuilder来进行拼接xml。
2、将拼接好的字符串通过缓冲字符输出流输出到xml文件中就行。
2、日志技术
作用1:把程序运行的信息,记录到文件中,方便程序员定位bug、并了解程序的执行情况等。
作用2:可以随时以开关的形式控制日志的启停,无需侵入到源代码中去进行修改。
因为对Commons Logging接口不满意,有人就搞了SLF4};因为对Log4j的性能不满意,有人就搞了Logback。


下载对应的jar包: slf4j-api、``logback-core、logback-classic`
下载jar包网站,以后所以的jar包都可以在里面下载,也支持maven下载。
网站链接:https://mvnrepository.com
注意版本间是兼容,可参考:slf4j-api-1.7.26、logback-core-1.2.3、logback-classic-1.2.3
2.1 实现步骤
-
导入
slf4j-api、logback-core、logback-classic框架到项目中去。 -
将Logback框架的核心配置文件logback.xml直接拷贝到src目录下(必须是src下),logback.xml如下:注意改一下路径,改到自己的项目目录下的某个地方。
value="W:/StudyFile.."<?xml version="1.0" encoding="UTF-8"?> <configuration debug="false"><!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径--><property name="LOG_HOME" value="W:/StudyFile/Java/Projiect/BasicTraining/object-app/src/log"/><!--日志输出位置:控制台日志, 控制台输出 --><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度,%msg:日志消息,%n是换行符--><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern></encoder></appender><!--文件日志, 按照每天生成日志文件 --><appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!--日志文件输出的文件名--><FileNamePattern>${LOG_HOME}/TestWeb.log.%d{yyyy-MM-dd}.log</FileNamePattern><!--日志文件保留天数--><MaxHistory>30</MaxHistory></rollingPolicy><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符--><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern><!--日志输出编码--><charset>UTF-8</charset></encoder><!--日志文件最大的大小--><triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"><MaxFileSize>10MB</MaxFileSize></triggeringPolicy></appender><!-- show parameters for hibernate sql 专为 Hibernate 定制 --><logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="TRACE" /><logger name="org.hibernate.type.descriptor.sql.BasicExtractor" level="DEBUG" /><logger name="org.hibernate.SQL" level="DEBUG" /><logger name="org.hibernate.engine.QueryParameters" level="DEBUG" /><logger name="org.hibernate.engine.query.HQLQueryPlan" level="DEBUG" /><!--myibatis log configure--><logger name="com.apache.ibatis" level="TRACE"/><logger name="java.sql.Connection" level="DEBUG"/><logger name="java.sql.Statement" level="DEBUG"/><logger name="java.sql.PreparedStatement" level="DEBUG"/><!-- 日志输出级别 (level="OFF" 所有是日志都不记录,level="ALL" 所有的日志都被记录,level="DEBUG" 代表所有等级为DEBUG及以上的日志(即 DEBUG, INFO, WARN, ERROR)都会被记录下来。) --><root level="DEBUG"><!--输出到控制台--><appender-ref ref="STDOUT" /><!--输出到文件--><appender-ref ref="FILE"/></root> </configuration>日志级别指的是日志信息的类型,日志都会分级别,常见的日志级别如下表(优先级依次升高) :
只有日志的级别是大于或等于核心配置文件配置的日志级别,才会被记录,否则不记录。
日志级别 说明 trace 追踪,指明程序运行轨迹 debug 调试,实际应用中一般将其作为最低级别,而trace则很少使用 info 输出重要的运行信息,数据连接、网络连接、10操作等等,使用较多 warn 警告信息, 可能会发生问题,使用较多 error 错误信息,使用较多 -
创建Logback框架提供的Logger对象,然后用Logger对象调用其提供的方法就可以记录系统的日志信息。类名随便取。
public static final Logger LOGGER = LoggerFactory. getLogger(“类名");
2.2 测试代码
会在控制台上输出,也会写入到 :TestWeb+文件修改日期.log 的文件里。
public class LogBackTest {//创建一个日志对象public static final Logger LOGGER= LoggerFactory.getLogger("LogTest");public static void main(String[] args) {LOGGER.info("开始记录日志!");chu(10,0);LOGGER.info("执行成功日志!");}public static void chu(int a,int b){LOGGER.debug("传入的值为:a="+a+",b="+b);try {int c=a/b;LOGGER.info("结果为:"+c);}catch(Exception e){LOGGER.error("错误日志:"+e);}}
}
相关文章:
Java基础12-特殊文件和日志技术
十二、特殊文件和日志技术 1、特殊文件 properties:用来存储键值对数据。 xml:用来存储有关系的数据。 1.1 properties文件 特点:存储键值对,键不能重复,文件后缀一般是.properties结尾的。 properties:是…...
2.4 STM32启动过程
目录 一,启动Flow 1.1 初始化MSP 1.2 初始化PC 1.3 设置堆栈大小 1.4初始化中断向量表 1.5 调用初始化函数(可选) 1.6 调用__main 二,Reset_Handler函数 一,启动Flow 下面是stm32在内部FLASH启动的启动建议流程图,在stm32复位到执行我们程序的main函数的过程中,…...
rm: cannot remove: Device or resource busy 解决方案
大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…...
2024年的5款AI写作工具,你用过几个?
AI技术正逐渐渗透到我们生活的方方面面,其中就包括写作领域。今天,我要为大家介绍5款实用的AI写作助手,它们将帮助你提高写作效率,激发创作灵感,让你的写作之路更加顺畅。 1. 宙语Cosmos-全能写作助手 网址ÿ…...
泛癌热门靶点TROP2及研究工具试剂
前 言 TROP2属于肿瘤相关抗原之一,在多种肿瘤中表达升高,促进肿瘤细胞生长、增殖和转移。TROP2已经成为近年来NEJM、肿瘤学期刊、药物研发的多重热点。通过PubMed检索到477篇相关文献,自2020年文献数量逐步增加,2022年达81篇&am…...
2848. 与车相交的点
2848. 与车相交的点 题目链接:2848. 与车相交的点 代码如下: class Solution { public:int numberOfPoints(vector<vector<int>>& nums){set<int> s;for (int i 0; i < nums.size(); i){for (int j nums[i][0]; j < nu…...
第1节 入门
文章目录 1. URL 组成部分详解2. 第一个 Django 项目2.1 项目结构2.2 project 和 app 的关系 3. URL 与视图函数的映射4. URL 的两种传参方式4.1 通过字符串查询4.2 在 path 中携带 5. path 函数详解6. 路由模块化7. 路由反转 1. URL 组成部分详解 URL 的基本组成格式 scheme…...
四数之和(medium)08
其实这道题就是求2数之和,和3数之和的衍生吧,核心算法还是双指针; 暴力解法就不再说了:排序暴力set去重; 直接上:排序双指针去重 大致思路如上图,如果要详细算法过程,可以就看看两数…...
TypeScript中 interface接口 type关键字 enum枚举类型
type interface总是傻傻分不清~~~ Type Aliases (type) type 关键字用于为类型定义一个别名。这可以是基本类型、联合类型、元组、数组、函数等。type 定义的类型在编译后的 JavaScript 代码中会被移除,不会留下任何运行时的代码。 //联合类型 type StringOrNumbe…...
vue3.2实现AES加密解密,秘钥通过API获取,并混淆秘钥,后端thinkphp
aes.ts文件 import CryptoJS from "crypto-js"; import axios from "axios";export const encrypt async(data: any) > {let storeKey sessionStorage.getItem(a)let storeIv:any sessionStorage.getItem(i)// 如果秘钥或 IV 不存在,尝试…...
简述微服务高可用之Sentinel、Seate
简述微服务高可用之Sentinel、Seate使用 下文主要讲述使用sentinel,如何降级限流熔断及如何使用seata管理分布式事务 sentinel服务端安装与使用 1、下载 进入https://github.com/alibaba/Sentinel/releases 根据你的需求进行下载对应版本 我这里是JDK17 下载的1.8.8版本&am…...
将爱传递 将“服务好”延伸
从泰康客户,转身成为泰康人,她直言是因为亲身感受了泰康“服务好”的魅力。 入司已8年的泰康养老浙江分公司HWP何英英,是泰康“服务好”的受益者。她从朋友的理赔中见证了泰康服务好的温度与力量,又被泰康养老的职域模式所吸引选择加入泰康。如今,她全身心投入在服务的第一线,…...
基于MinIO配置bucket,用于文件下载和浏览
文章目录 引言I 配置文件浏览安装MinIO配置自启动服务访问权限配置文件浏览访问地址文件下载地址II 知识扩展MinIO内置访问策略只读策略只写策略读写策略diagnosticsconsoleAdmin引言 需求:文件下载用于OTA升级,文件浏览用于产品展示。 实现方案:基于MinIO配置bucket访问权…...
Ubuntu 配置 ssh 免密连接、安装Docker、docker-compose
Ubuntu 配置 ssh 免密连接 本机 #生成密钥 ssh-keygen -t rsa -b 4096 #发送公钥到服务器 ssh-copy-id usernameremote_host #测试 ssh usernameremote_host全部回车,密钥存储路径默认是 ~/.ssh/id_rsa 服务器 确认服务器公钥配置允许远程公钥认证 sudo vim /et…...
C++ -string -常见用法2
博客主页:【夜泉_ly】 本文专栏:【C】 欢迎点赞👍收藏⭐关注❤️ 文章目录 💡前言💡访问及遍历1.速览2.operator[] -重点⭐2.1函数原型2.2用法2.3与at 3.迭代器3.1函数原型3.2用法速览3.3简介 4.范围for4.1用法速览4.2…...
为您的 WordPress 网站打造完美广告布局 A5广告单元格插件
一个为 WordPress 网站量身定制的强大工具,它将彻底改变您展示广告的方式 灵活多变的布局设计 A5 广告单元格插件的核心优势在于其无与伦比的灵活性。无论您是想要创建整齐的网格布局,还是希望打造独特的不规则设计,这款插件都能满足您的需求。 自定义网格数量:从 2…...
前端的AI工具:ChatGPT Canvas与Claude Artifacts对比 -仅仅是OpenAI一个迟来的追赶吗?- 贺星舰五飞试验成功
如果你对OpenAI的ChatGPT Canvas和Anthropic的Claude Artifacts有所耳闻,可能会想知道这两个工具有何不同,以及哪个能让你的工作流程更加顺畅。这两个工具旨在提升生产力,但侧重点各异——编码、写作、创意和实时反馈。 本文将深入探讨ChatG…...
GNU链接器(LD):输出分区类型(NOLOAD、READONLY、DSECT、COPY、INFO、OVERLAY)介绍
0 参考资料 GNU-LD-v2.30-中文手册.pdf GNU linker.pdf1 前言 一个完整的编译工具链应该包含以下4个部分: (1)编译器 (2)汇编器 (3)链接器 (4)lib库 在GNU工具链中&…...
【MySQL】表的查询操作——SELECT
目录 1.select的基本使用 1.1.查询所有列 1.2.查询特定列 1.3.DISTINCT关键字的使用——查询不重复的年级 1.4.带条件的查询 1.5.排序查询结果 1.6.LIMIT的使用——限制返回的行数 1.7.组合使用 WHERE、ORDER BY 和 LIMIT 1.8.查询字段为表达式 1.9.为查询结果指定别名…...
天地伟业NVR管理工具EasyNVR平台多个NVR同时管理运行后日志一直在打印error
视频安防监控平台天地伟业NVR管理工具EasyNVR可支持设备通过RTSP/Onvif协议接入,并能对接入的视频流进行处理与多端分发,包括RTMP、RTSP、WS-FLV、HTTP-FLV、WebRTC、HLS等多种视频流格式。平台可提供视频实时监控直播、云端录像、录像检索、云存储与回看…...
数据库索引优化与慢查询排查实战:1000名工人工单工单系统性能攻坚
数据库索引优化与慢查询排查实战:千人施工队工单系统性能攻坚场景:某建筑集团大型商业综合体项目 规模:1000名工人,日均生成3000工单,工单表累计800万记录 痛点:早班派工高峰期系统卡顿,工单查询…...
石家庄整家定制哪个口碑好
在石家庄选择整家定制服务时,许多家庭会关注品牌的口碑、设计、环保与工艺。一个注重细节、提供系统解决方案的品牌,往往能更好地满足现代家居生活的需求。为什么整家定制受到青睐?整家定制能够根据户型、居住者习惯和审美偏好,提…...
手把手教你用STM32H7S7实现高速USB复合设备(CDC+MSC):从CubeMX配置到性能优化
STM32H7高速USB复合设备开发实战:CDCMSC架构设计与性能调优 在嵌入式系统开发中,USB复合设备技术正成为连接智能硬件与主机系统的关键桥梁。STM32H7系列凭借其Cortex-M7内核和480Mbps的高速USB外设,为开发者提供了实现高性能复合设备的理想平…...
Qwen3-0.6B-FP8与ComfyUI工作流结合:可视化AI应用搭建
Qwen3-0.6B-FP8与ComfyUI工作流结合:可视化AI应用搭建 最近在折腾AI应用的时候,我发现了一个挺有意思的组合:把轻量级的文本生成模型Qwen3-0.6B-FP8,接到ComfyUI这个可视化工作流工具里。听起来可能有点技术,但实际做…...
实战对比:ext4 vs NTFS vs XFS vs Btrfs vs ZFS - 哪个文件系统最适合你的SSD?
SSD文件系统终极对决:ext4/NTFS/XFS/Btrfs/ZFS实战指南 当你把一块崭新的SSD插入电脑时,系统通常会默认分配一个文件系统——但这是最佳选择吗?作为从业十年的存储工程师,我见过太多用户因为文件系统选择不当而损失30%以上的SSD性…...
Windows 7 SP2重构方案:现代硬件适配与系统焕新体验
Windows 7 SP2重构方案:现代硬件适配与系统焕新体验 【免费下载链接】win7-sp2 UNOFFICIAL Windows 7 Service Pack 2, to improve basic Windows 7 usability on modern systems and fully update Windows 7. 项目地址: https://gitcode.com/gh_mirrors/wi/win7-…...
Realistic Vision V5.1 模型安全与内容过滤部署指南
Realistic Vision V5.1 模型安全与内容过滤部署指南 如果你正在公司里部署AI图像生成服务,最头疼的问题是什么?除了模型效果和生成速度,恐怕就是内容安全了。你肯定不希望员工或者用户用它生成一些不合规的图片,这不仅可能违反公…...
YOLO X Layout模型测试:基于Pytest的自动化测试框架
YOLO X Layout模型测试:基于Pytest的自动化测试框架 当你辛辛苦苦训练或部署了一个YOLO X Layout模型,准备用它来解析合同、发票或者学术论文时,最怕遇到什么?不是模型本身不够强大,而是某次代码更新后,它…...
5分钟掌握终极资源下载神器:res-downloader跨平台智能嗅探工具
5分钟掌握终极资源下载神器:res-downloader跨平台智能嗅探工具 【免费下载链接】res-downloader 资源下载器、网络资源嗅探,支持微信视频号下载、网页抖音无水印下载、网页快手无水印视频下载、酷狗音乐下载等网络资源拦截下载! 项目地址: https://git…...
别再只盯着username了!CTF表单注入题中,用Sqlmap探测password等隐藏参数的高效技巧
突破思维定式:CTF表单注入中隐藏参数的高阶利用策略 在CTF竞赛的Web安全赛道上,SQL注入始终是选手们的必修课。但当我们反复练习username参数注入时,出题人早已在暗处微笑——他们知道大多数选手会形成路径依赖。我曾在一个省级CTF比赛中遇到…...
