🔥 本文由 程序喵正在路上 原创,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>