当前位置: 首页 > news >正文

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中,需要转义的字符有:

&   &amp; 
<   &lt; 
>   &gt; 
"   &quot; 
'   &apos; 

也可以输入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-corelogback-classic`

下载jar包网站,以后所以的jar包都可以在里面下载,也支持maven下载。

网站链接:https://mvnrepository.com

注意版本间是兼容,可参考:slf4j-api-1.7.26、logback-core-1.2.3、logback-classic-1.2.3

2.1 实现步骤
  1. 导入slf4j-api、logback-corelogback-classic框架到项目中去。

  2. 将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错误信息,使用较多
  3. 创建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&#xff1a;用来存储键值对数据。 xml&#xff1a;用来存储有关系的数据。 1.1 properties文件 特点&#xff1a;存储键值对&#xff0c;键不能重复&#xff0c;文件后缀一般是.properties结尾的。 properties&#xff1a;是…...

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技术正逐渐渗透到我们生活的方方面面&#xff0c;其中就包括写作领域。今天&#xff0c;我要为大家介绍5款实用的AI写作助手&#xff0c;它们将帮助你提高写作效率&#xff0c;激发创作灵感&#xff0c;让你的写作之路更加顺畅。 1. 宙语Cosmos-全能写作助手 网址&#xff…...

泛癌热门靶点TROP2及研究工具试剂

前 言 TROP2属于肿瘤相关抗原之一&#xff0c;在多种肿瘤中表达升高&#xff0c;促进肿瘤细胞生长、增殖和转移。TROP2已经成为近年来NEJM、肿瘤学期刊、药物研发的多重热点。通过PubMed检索到477篇相关文献&#xff0c;自2020年文献数量逐步增加&#xff0c;2022年达81篇&am…...

2848. 与车相交的点

2848. 与车相交的点 题目链接&#xff1a;2848. 与车相交的点 代码如下&#xff1a; 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数之和&#xff0c;和3数之和的衍生吧&#xff0c;核心算法还是双指针&#xff1b; 暴力解法就不再说了&#xff1a;排序暴力set去重&#xff1b; 直接上&#xff1a;排序双指针去重 大致思路如上图&#xff0c;如果要详细算法过程&#xff0c;可以就看看两数…...

TypeScript中 interface接口 type关键字 enum枚举类型

type interface总是傻傻分不清~~~ Type Aliases (type) type 关键字用于为类型定义一个别名。这可以是基本类型、联合类型、元组、数组、函数等。type 定义的类型在编译后的 JavaScript 代码中会被移除&#xff0c;不会留下任何运行时的代码。 //联合类型 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 不存在&#xff0c;尝试…...

简述微服务高可用之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全部回车&#xff0c;密钥存储路径默认是 ~/.ssh/id_rsa 服务器 确认服务器公钥配置允许远程公钥认证 sudo vim /et…...

C++ -string -常见用法2

博客主页&#xff1a;【夜泉_ly】 本文专栏&#xff1a;【C】 欢迎点赞&#x1f44d;收藏⭐关注❤️ 文章目录 &#x1f4a1;前言&#x1f4a1;访问及遍历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 广告单元格插件的核心优势在于其无与伦比的灵活性。无论您是想要创建整齐的网格布局,还是希望打造独特的不规则设计,这款插件都能满足您的需求。 自定义网格数量&#xff1a;从 2…...

前端的AI工具:ChatGPT Canvas与Claude Artifacts对比 -仅仅是OpenAI一个迟来的追赶吗?- 贺星舰五飞试验成功

如果你对OpenAI的ChatGPT Canvas和Anthropic的Claude Artifacts有所耳闻&#xff0c;可能会想知道这两个工具有何不同&#xff0c;以及哪个能让你的工作流程更加顺畅。这两个工具旨在提升生产力&#xff0c;但侧重点各异——编码、写作、创意和实时反馈。 本文将深入探讨ChatG…...

GNU链接器(LD):输出分区类型(NOLOAD、READONLY、DSECT、COPY、INFO、OVERLAY)介绍

0 参考资料 GNU-LD-v2.30-中文手册.pdf GNU linker.pdf1 前言 一个完整的编译工具链应该包含以下4个部分&#xff1a; &#xff08;1&#xff09;编译器 &#xff08;2&#xff09;汇编器 &#xff08;3&#xff09;链接器 &#xff08;4&#xff09;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协议接入&#xff0c;并能对接入的视频流进行处理与多端分发&#xff0c;包括RTMP、RTSP、WS-FLV、HTTP-FLV、WebRTC、HLS等多种视频流格式。平台可提供视频实时监控直播、云端录像、录像检索、云存储与回看…...

数据库索引优化与慢查询排查实战:1000名工人工单工单系统性能攻坚

数据库索引优化与慢查询排查实战&#xff1a;千人施工队工单系统性能攻坚场景&#xff1a;某建筑集团大型商业综合体项目 规模&#xff1a;1000名工人&#xff0c;日均生成3000工单&#xff0c;工单表累计800万记录 痛点&#xff1a;早班派工高峰期系统卡顿&#xff0c;工单查询…...

石家庄整家定制哪个口碑好

在石家庄选择整家定制服务时&#xff0c;许多家庭会关注品牌的口碑、设计、环保与工艺。一个注重细节、提供系统解决方案的品牌&#xff0c;往往能更好地满足现代家居生活的需求。为什么整家定制受到青睐&#xff1f;整家定制能够根据户型、居住者习惯和审美偏好&#xff0c;提…...

手把手教你用STM32H7S7实现高速USB复合设备(CDC+MSC):从CubeMX配置到性能优化

STM32H7高速USB复合设备开发实战&#xff1a;CDCMSC架构设计与性能调优 在嵌入式系统开发中&#xff0c;USB复合设备技术正成为连接智能硬件与主机系统的关键桥梁。STM32H7系列凭借其Cortex-M7内核和480Mbps的高速USB外设&#xff0c;为开发者提供了实现高性能复合设备的理想平…...

Qwen3-0.6B-FP8与ComfyUI工作流结合:可视化AI应用搭建

Qwen3-0.6B-FP8与ComfyUI工作流结合&#xff1a;可视化AI应用搭建 最近在折腾AI应用的时候&#xff0c;我发现了一个挺有意思的组合&#xff1a;把轻量级的文本生成模型Qwen3-0.6B-FP8&#xff0c;接到ComfyUI这个可视化工作流工具里。听起来可能有点技术&#xff0c;但实际做…...

实战对比:ext4 vs NTFS vs XFS vs Btrfs vs ZFS - 哪个文件系统最适合你的SSD?

SSD文件系统终极对决&#xff1a;ext4/NTFS/XFS/Btrfs/ZFS实战指南 当你把一块崭新的SSD插入电脑时&#xff0c;系统通常会默认分配一个文件系统——但这是最佳选择吗&#xff1f;作为从业十年的存储工程师&#xff0c;我见过太多用户因为文件系统选择不当而损失30%以上的SSD性…...

Windows 7 SP2重构方案:现代硬件适配与系统焕新体验

Windows 7 SP2重构方案&#xff1a;现代硬件适配与系统焕新体验 【免费下载链接】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图像生成服务&#xff0c;最头疼的问题是什么&#xff1f;除了模型效果和生成速度&#xff0c;恐怕就是内容安全了。你肯定不希望员工或者用户用它生成一些不合规的图片&#xff0c;这不仅可能违反公…...

YOLO X Layout模型测试:基于Pytest的自动化测试框架

YOLO X Layout模型测试&#xff1a;基于Pytest的自动化测试框架 当你辛辛苦苦训练或部署了一个YOLO X Layout模型&#xff0c;准备用它来解析合同、发票或者学术论文时&#xff0c;最怕遇到什么&#xff1f;不是模型本身不够强大&#xff0c;而是某次代码更新后&#xff0c;它…...

5分钟掌握终极资源下载神器:res-downloader跨平台智能嗅探工具

5分钟掌握终极资源下载神器&#xff1a;res-downloader跨平台智能嗅探工具 【免费下载链接】res-downloader 资源下载器、网络资源嗅探&#xff0c;支持微信视频号下载、网页抖音无水印下载、网页快手无水印视频下载、酷狗音乐下载等网络资源拦截下载! 项目地址: https://git…...

别再只盯着username了!CTF表单注入题中,用Sqlmap探测password等隐藏参数的高效技巧

突破思维定式&#xff1a;CTF表单注入中隐藏参数的高阶利用策略 在CTF竞赛的Web安全赛道上&#xff0c;SQL注入始终是选手们的必修课。但当我们反复练习username参数注入时&#xff0c;出题人早已在暗处微笑——他们知道大多数选手会形成路径依赖。我曾在一个省级CTF比赛中遇到…...