🔥 本文由 程序喵正在路上 原创,CSDN首发!
💖 系列专栏:Java从入门到大牛
🌠 首发时间:2023年10月27日
🦋 欢迎关注🖱点赞👍收藏🌟留言🐾
🌟 不努力,你来这个世界当间谍的吗
目录
- 文件的种类
- 特殊文件:Properties属性文件
- 特殊文件:XML文件
- 概述
- 读取XML文件中的数据
- 补充知识:约束XML文件的编写 [了解即可]
- 日志技术
- 概述
- 日志技术体系、Logback日志框架的概述
- Logback快速入门
- Logback设置日志级别
文件的种类
-
普通文件
-
属性文件
-
XML文件
特殊文件:Properties属性文件
Properties属性文件的特点
- 存储的每一行内容都只能是键值对
- 键不能重复
- 文件后缀一般是 .properties 结尾
- Properties 是一个 Map 集合(键值对集合),但是我们一般不会当集合使用
- 核心作用:Properties 是用来代表属性文件的,通过 Properties 可以读写属性文件里的内容
使用Properties读取属性文件里的键值对数据
具体应用
首先,我们需要准备一个文件来读取,在项目的 src 目录下新建一个 File,命名为 users.properties
然后,我们就可以写代码来读取它了
import java.io.FileReader;
import java.util.Properties;
import java.util.Set;/*** 目标:掌握使用Properties类读取属性文件中的键值对信息*/
public class PropertiesTest1 {public static void main(String[] args) throws Exception {// 1、创建一个Properties的对象出来(键值对集合,空容器)Properties properties = new Properties();System.out.println(properties);// 2、开始加载属性文件中的键值对数据到properties对象中去properties.load(new FileReader("properties-xml-log-app\\src\\users.properties"));System.out.println(properties);// 3、根据键取值System.out.println(properties.getProperty("赵敏"));System.out.println(properties.getProperty("张无忌"));// 4、遍历全部的键和值Set<String> keys = properties.stringPropertyNames();for (String key : keys) {String value = properties.getProperty(key);System.out.println(key + "---->" + value);}properties.forEach((k, v) -> {System.out.println(k + "---->" + v);});}
}
使用Properties把键值对数据写出到属性文件里去
具体应用
import java.io.FileWriter;
import java.util.Properties;/*** 目标:掌握把键值对数据存入到属性文件中去*/
public class PropertiesTest2 {public static void main(String[] args) throws Exception {// 1、创建Properties对象出来,先用它存储一些键值对数据Properties properties = new Properties();properties.setProperty("张无忌", "minmin");properties.setProperty("殷素素", "cuishan");properties.setProperty("张翠山", "susu");// 2、把properties对象中的键值对数据存入到属性文件中去properties.store(new FileWriter("properties-xml-log-app/src/users2.properties"), "i saved many users!");}
}
特殊文件:XML文件
概述
XML(全称EXtensible Markup Language,可拓展标记语言)
-
本质是一种数据的格式,可以用来存储复杂的数据结构和数据关系
XML的特点
- XML 中的 “<标签名>” 称为一个标签或一个元素,一般是成对出现的
- XML 中的标签名可以自己定义(可扩展),但必须要正确的嵌套
- XML 中只能有一个根标签
- XML 中的标签可以有属性
- 如果一个文件中放置的是 XML 格式的数据,这个文件就是 XML 文件,后缀一般要写成 .xml
XML的创建
- 就是创建一个 XML 类型的文件,要求文件的后缀必须使用 xml,如 hello_world.xml
IDEA创建XML文件
XML的语法规则
-
XML文件的后缀名为 xml,文档声明必须是第一行
<?xml version="1.0" encoding="UTF-8" ?> version: XML默认的版本号码、该属性是必须存在的 encoding: 本XML文件的编码
-
XML中可以定义注释信息:
<!-- 注释内容 -->
-
XML中书写 “<”、“&” 等符号可能会出现冲突,导致报错,此时可以用如下特殊字符替代
< < 小于 > > 大于 & & 和号 ' ' 单引号 " " 引号
-
XML 中可以写一个叫 CDATA 的数据区:
<![CDATA[ ...内容... ]]>
,里面的内容可以随便写
例如,我们随便写一个 xml 文件,命名为 helloworld.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!-- 注释:以上抬头声明必须放在第一行,必须有 -->
<!-- 根标签只能有一个 -->
<users><user id="1" desc="第一个用户"><name>张无忌</name><sex>男</sex><地址>光明顶</地址><password>minmin</password><data> 3 < 2 && 5 > 4 </data><data1><![CDATA[3 < 2 && 5 > 4]]></data1></user><people>很多人</people><user id="2"><name>敏敏</name><sex>女</sex><地址>光明顶</地址><password>wuji</password><data> 3 < 2 && 5 > 4 </data><data1><![CDATA[3 < 2 && 5 > 4]]></data1></user>
</users>
我们可以通过浏览器来查看这个文件展示的内容,步骤:在 IDEA 的 xml 文件界面右键鼠标,选择 Open In → \rightarrow → Browser,接着选择一个浏览器打开即可,结果大致如下
XML的作用和应用场景
- 本质是一种数据格式,可以存储复杂的数据结构和数据关系
- 应用场景:经常用来作为系统的配置文件;或者作为一种特殊的数据结构,在网络中进行传输
读取XML文件中的数据
读取 XML 文件中的数据,业界内通常将其叫做解析 XML 文件
解析XML文件
- 使用程序读取 XML 文件中的数据
注意:程序员并不需要自己写原始的 IO 流代码来解析 XML,难度较大,且相当繁琐
其实,现在有很多开源的、好用的解析 XML 的框架,最知名的是 Dom4j(第三方研发的)
使用 Dom4j 解析出 XML 文件的具体步骤
需求:使用 Dom4j 把一个 XML 文件的数据进行解析
分析:
- 下载 Dom4j 框架,官网下载可能比较慢,建议直接在 CSDN 搜索 “dom4j下载”,有众多教程任君选择
- 在项目中创建一个文件夹 Directory,建议命名为 lib
- 将 dom4j-2.1.3.jar 文件复制到 lib 文件夹
- 在 jar 文件上点击右键,选择 Add as Library,然后再点击 OK
- 在类中导包使用
DOM4J解析XML文件的思想:文档对象模型
Dom4j 解析 XML 得到 Document 对象
-
SAXReader:Dom4j 提供的一个解析器,可以认为是代表整个 Dom4j 框架
-
Document
Element 提供的方法
具体应用
对前面写的 helloworld.xml 进行解析
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;import java.util.List;/*** 目标:掌握使用Dom4j框架解析XML文件*/
public class Dom4JTest1 {public static void main(String[] args) throws Exception {// 1、创建一个Dom4J框架提供的解析器对象SAXReader saxReader = new SAXReader();// 2、使用saxReader对象把需要解析的XML文件读成一个Document对象Document document =saxReader.read("properties-xml-log-app\\src\\helloworld.xml"); // 相对路径// 3、从文档对象中解析XML文件的全部数据Element root = document.getRootElement();System.out.println(root.getName());// 4、获取根元素下的全部一级子元素。// List<Element> elements = root.elements();List<Element> elements = root.elements("user");for (Element element : elements) {System.out.println(element.getName());}// 5、获取当前元素下的某个子元素。Element people = root.element("people");System.out.println(people.getText());// 如果下面有很多子元素user,默认获取第一个。Element user = root.element("user");System.out.println(user.elementText("name"));// 6、获取元素的属性信息呢?System.out.println(user.attributeValue("id"));Attribute id = user.attribute("id");System.out.println(id.getName());System.out.println(id.getValue());List<Attribute> attributes = user.attributes();for (Attribute attribute : attributes) {System.out.println(attribute.getName() + "=" + attribute.getValue());}// 7、如何获取全部的文本内容:获取当前元素下的子元素文本值System.out.println(user.elementText("name"));System.out.println(user.elementText("地址"));System.out.println(user.elementTextTrim("地址")); // 取出文本去除前后空格System.out.println(user.elementText("password"));Element data = user.element("data");System.out.println(data.getText());System.out.println(data.getTextTrim()); // 取出文本去除前后空格}
}
执行结果如下
如何使用程序把数据写出到XML文件中去呢
不建议使用 dom4j 来做,推荐直接把程序里的数据拼接成 XML 格式,然后用 IO 流写出去
例如
import java.io.BufferedWriter;
import java.io.FileWriter;/*** 目标:如何使用程序把数据写出到 XML文件中去* <?xml version="1.0" encoding="UTF-8" ?>* <book>* <name>从入门到跑路</name>* <author>dlei</author>* <price>999.9</price>* </book>*/
public class Dom4JTest2 {public static void main(String[] args) {// 1、使用一个StringBuilder对象来拼接XML格式的数据StringBuilder sb = new StringBuilder();sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\r\n"); // \r\n为换行sb.append("<book>\r\n");sb.append("\t<name>").append("从入门到跑路").append("</name>\r\n");sb.append("\t<author>").append("dlei").append("</author>\r\n");sb.append("\t<price>").append(999.99).append("</price>\r\n");sb.append("</book>");try (// 用完需要释放BufferedWriter bw = new BufferedWriter(new FileWriter("properties-xml-log-app/src/book.xml"));){bw.write(sb.toString()); // 写出去} catch (Exception e) {e.printStackTrace();}}
}
补充知识:约束XML文件的编写 [了解即可]
什么是约束XML文件的书写?
就是限制XML文件只能按照某种格式进行书写
什么是约束文档
专门用来限制 XML 书写格式的文档,比如:限制标签、属性应该怎么写
约束文档的分类
- DTD文档
- Schema文档
XML文档约束-DTD的使用(了解)
需求:利用 DTD 约束文档,约束一个 XML 文件的编写
- 编写 DTD 约束文档,后缀必须是 .dtd(了解即可,不用学会写)
- 在需要编写的 XML 文件中导入该 DTD 约束文档
- 然后 XML 文件就必须按照 DTD 约束文档指定的格式进行编写,否则会报错
注意:DTD 文档只能约束 XML 文件的标签,不能约束标签里面内容的数据类型
应用(了解即可)
XML文档约束-Schema的使用(了解)
需求:利用 Schema 文档约束一个 XML 文件的编写
- 编写 Schema 约束文档,后缀必须是 .xsd
- 在需要编写的 XML 文件中导入该 Schema 约束文档
- 按照约束内容编写 XML 文件的内容
注意:可以约束 XML 文件的编写和数据类型
日志技术
概述
什么是日志?
在开发时,我们可能会遇到以下问题:
- 希望系统能记住某些数据是被谁操作的,比如被谁删除了?
- 想分析用户浏览系统的具体情况,以便挖掘用户的具体喜好?
- 当系统在开发中或上线后出现了 bug,崩溃了,该通过什么去分析和定位 bug 呢?
想解决上述问题,我们需要用到日志技术
日志就好比生活中的日记,可以记录你生活中的点点滴滴;而程序中的日志,通常就是一个文件,里面记录的是程序运行过程中的各种信息
以前记录日志的方案
public static void test(String number) {try {int result = Integer.parseInt(number);System.out.println("输入的数字为" + result);} catch(NumberFormatException e) {System.out.printlnl("输入的数字有误,请输入一个整数");}
}
之前,我们都是通过诸如捕获异常的方式,将日志信息展示在控制台上
这样做有以下弊端:
- 日志会展示在控制台,控制台关闭日志信息就丢失了
- 不能更方便地将日志记录到其他位置,比如文件中或数据库中
- 如果想取消日志,还需要修改源代码才可以完成
日志技术的特点
- 可以将系统执行的信息,方便地记录到指定的位置(控制台、文件中、数据库中)
- 可以随时以开关的形式控制日志的启停,无需侵入到源代码中去进行修改
日志技术体系、Logback日志框架的概述
- 日志框架:牛人或者第三方公司已经做好的实现代码,后来者直接可以拿去使用
- 日志接口:设计日志框架的一套标准,日志框架需要实现这些接口
- 注意1:因为对 Commons Logging 接口不满意,有人就搞了 SLF4J;因为对 Log4j 的性能不满意,有人就搞了 Logback
- 注意2:Logback 是基于 slf4j 的日志规范实现的框架
Logback 日志框架官网:http://logback.qos.ch/index.html
Logback 日志框架有以下几个模块:
如果想要使用 Logback 日志框架,至少需要在项目中整合如下三个模块:
- slf4j-api:日志接口
- logback-core
- logback-classic
对于目前的我们,是需要一个一个去下载的,过程也是比较麻烦,后面学了 maven 这个工具就不用我们自己下载了
需要的资源博主已经上传到 CDSN,点击此处免费下载
Logback快速入门
需求:使用 Logback 日志框架,记录系统的运行信息
实现步骤:
-
导入 Logback 框架到项目中去,也就是前面提到的那三个模块
-
将 Logback 框架的核心配置文件 logback.xml 直接拷贝到 src 目录下(必须是 src 下),记住,logback.xml 不需要我们自己写,以后工作的时候公司会给
-
创建 Logback 框架提供的 Logger 对象,然后用 Logger 对象调用其提供的方法就可以记录系统的日志信息
public static final Logger LOGGER = LoggerFactory.getLogger("类名");
应用演示
import org.slf4j.Logger; // 注意必须是 slf4j 包下的 Logger
import org.slf4j.LoggerFactory;/*** 目标:掌握LogBack日志框架的使用*/
public class LogBackTest {// 创建一个Logger日志对象public static final Logger LOGGER = LoggerFactory.getLogger("LogBackTest");public static void main(String[] args) {try {LOGGER.info("chu法方法开始执行~~~");chu(10, 0);LOGGER.info("chu法方法执行成功~~~");} catch (Exception e) {LOGGER.error("chu法方法执行失败了,出现了bug~~~");}}public static void chu(int a, int b){LOGGER.debug("参数a:" + a);LOGGER.debug("参数b:" + b);int c = a / b;LOGGER.info("结果是:" + c);}
}
核心配置文件logback.xml
作用:对 logback 日志框架进行控制
日志的输出位置、输出格式的控制
通常我们可以设置 2 个输出日志的位置:一个是控制台,一个是系统文件中
// 输出到控制台
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
// 输出到文件中
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
开启日志(ALL),关闭日志(OFF)
// 开启日志
<root level="ALL"><appender-ref ref="CONSOLE"/><appender-ref ref="FILE" />
</root>
Logback设置日志级别
什么是日志级别?
日志级别指的是日志信息的类型,日志都会分级别,常见的日志级别如下,优先级从上到下依次升高:
为什么要学习日志级别?
如果我们想让程序只记录 info 及以上级别的日志,那我们就需要用到日志级别了
比如,我们将 level 改为 info
// 只记录 info warn error 日志
<root level="info"><appender-ref ref="CONSOLE"/><appender-ref ref="FILE" />
</root>
只有日志的级别是大于或等于核心配置文件配置的日志级别,才会被记录,否则不记录
如果不想让日志输出到控制台或者文件中,我们可以删除下面任一语句
// 只输出到控制台中
<root level="info"><appender-ref ref="CONSOLE"/>
</root>// 只输出到文件中
<root level="info"><appender-ref ref="FILE" />
</root>