1. 特殊文件:Properties属性文件
Properties
- 是一个Map集合(键值对集合),但是我们一般不会当集合使用。
- 核心作用:Properties是用来代表属性文件的,通过Properties可以读写属性文件里的内容。
使用Properties读取属性文件里的键值对数据
# users.properties
# 以下内容都是用户名和密码
admin=123456
张无忌=minmin
周芷若=wuji
赵敏=wuji
/**
* 目标:掌握使用Properties类读取属性文件中的键值对信息。
*/
public class PropertiesTest1 {
public static void main(String[] args) throws Exception {
// 1、创建一个Properties的对象出来(键值对集合,空容器)
Properties properties = new Properties();
System.out.println(properties);
// 2、开始加载属性文件中的键值对数据到properties对象中去
Reader r = new FileReader("src\\users.properties");
properties.load(r);
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把键值对数据写出到属性文件里去
/**
* 目标:掌握把键值对数据存入到属性文件中去
*/
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对象中的键值对数据存入到属性文件中去
Writer w = new FileWriter("src\\users2.properties");
properties.store(w, "i saved many users !");
}
}
执行后src目录下得到一个文件
2. 特殊文件: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的作用和应用场景
- 本质是一种数据格式,可以存储复杂的数据结构,和数据关系。
- 应用场景:经常用来做为系统的配置文件;或者作为一种特殊的数据结构,在网络中进行传输。
读取XML文件中的数据
解析XML文件
- 使用程序读取XML文件中的数据
- 注意:程序员并不需要自己写原始的IO流代码来解析XML,难度较大!也相当繁琐!
- 其实,有很多开源的,好用的,解析XML的框架,最知名的是:Dom4j(第三方研发的)
使用Dom4J解析出XML文件
需求:使用Dom4J把一个XML文件的数据进行解析
分析:
- ①下载Dom4j框架,官网下载。
- ②在项目中创建一个文件夹:lib
- ③将dom4j-2.1.3.jar文件复制到 lib 文件夹
- ④在jar文件上点右键,选择 Add as Library -> 点击OK
- ⑤在类中导包使用
DOM4J解析XML文件的思想:文档对象模型
Dom4j解析XML-得到Document对象
- SAXReader:Dom4j提供的解析器,可以认为是代表整个Dom4j框架
- Document
<!-- 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>
</user>
<book>
<name>从入门到跑路</name>
<author>dlei</author>
<price>999.9</price>
</book>
</users>
/**
* 目标:掌握使用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("src\\helloworld.xml");
}
}
Element提供的方法
/**
* 目标:掌握使用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("src\\helloworld.xml");
// 3、从文档对象中解析XML文件的全部数据了
Element root = document.getRootElement();
System.out.println(root);
// 4、获取根元素下的全部一级子元素。
// List<Element> elements = root.elements();
List<Element> elements = root.elements("user");
System.out.println(elements);
for (Element element : elements) {
System.out.println(element.getName());
}
// 5、获取当前元素下的某个子元素。
Element element = root.element("people");
System.out.println(element.getText());
// 如果下面有很多子元素user,默认获取第一个。
Element user = root.element("user");
String firstName = user.elementText("name");
System.out.println(firstName);
// 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("sex"));
System.out.println(user.elementText("地址"));
System.out.println(user.elementText("password"));
System.out.println(user.elementText("data"));
System.out.println(user.elementText("data1"));
Element data1 = user.element("data1");
System.out.println(data1.getText());
System.out.println(data1.getTextTrim());
}
}
3. 日志技术
概述
什么是日志?
- 希望系统能记住某些数据是被谁操作的,比如被谁删除了?
- 想分析用户浏览系统的具体情况,以便挖掘用户的具体喜好?
- 当系统在开发中或者上线后出现了bug,崩溃了,该通过什么去分析、定位bug?
用来记录程序运行过程中的信息,并可以进行永久存储。
日志技术
- 可以将系统执行的信息,方便的记录到指定的位置(控制台、文件中、数据库中)。
- 可以随时以开关的形式控制日志的启停,无需侵入到源代码中去进行修改。
日志技术体系、Logback日志框架的概述
日志技术的体系结构
- 日志框架:牛人或者第三方公司已经做好的实现代码,后来者直接可以拿去使用。
- 日志接口:设计日志框架的一套标准,日志框架需要实现这些接口。
- 注意1:因为对Commons Logging接口不满意,有人就搞了SLF4J;因为对Log4j的性能不满意,有人就搞了Logback。
- 注意2:Logback是基于slf4j的日志规范实现的框架。
Logback日志框架官方网站:
- https://logback.qos.ch/index.html
Logback日志框架有以下几个模块:
想使用Logback日志框架,至少需要在项目中整合如下三个模块:
- slf4j-api:日志接口
- logback-core
- logback-classic
Logback快速入门
需求
- 使用Logback日志框架,纪录系统的运行信息。
实现步骤
-
①:导入Logback框架到项目中去。
slf4j-api:日志接口
logback-core
logback-classic -
②:将Logback框架的核心配置文件logback.xml直接拷贝到src目录下(必须是src下)。
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!--
CONSOLE :表示当前的日志信息是可以输出到控制台的。
-->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<!--输出流对象 默认 System.out 改为 System.err-->
<target>System.out</target>
<encoder>
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度
%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] %c [%thread] : %msg%n</pattern>
</encoder>
</appender>
<!-- File是输出的方向通向文件的 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
<charset>utf-8</charset>
</encoder>
<!--日志输出路径-->
<file>D:/log/itheima-data.log</file>
<!--指定日志文件拆分和压缩规则-->
<rollingPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--通过指定压缩文件名称,来确定分割文件方式-->
<fileNamePattern>D:/log/itheima-data-%i-%d{yyyy-MM-dd}-.log.gz</fileNamePattern>
<!--文件拆分大小-->
<maxFileSize>1MB</maxFileSize>
</rollingPolicy>
</appender>
<!--
1、控制日志的输出情况:如,开启日志,取消日志
trace 追踪,指明程序运行轨迹
debug 调试,实际应用中一般将其作为最低级别,而 trace 则很少使用
info 输出重要的运行信息,数据连接、网络连接、IO操作等等,使用较多
warn 警告信息,可能会发生问题,使用较多
error 错误信息, 使用较多
-->
<root level="info">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE" />
</root>
</configuration>
- ③:创建Logback框架提供的Logger对象,然后用Logger对象调用其提供的方法就可以记录系统的日志信息
public static final Logger LOGGER = LoggerFactory.getLogger("类名");
核心配置文件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设置日志级别
什么是日志级别?
- 日志级别指的是日志信息的类型,日志都会分级别,常见的日志级别如下(优先级依次升高):
为什么要学习日志级别?
<root level="info">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE" />
</root>
- 只有日志的级别是大于或等于核心配置文件配置的日志级别,才会被记录,否则不记录。