本文由 程序喵正在路上 原创,CSDN首发!
系列专栏:Java从入门到大牛
首发时间:2023年10月27日
欢迎关注点赞收藏留言
不努力,你来这个世界当间谍的吗
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(全称EXtensible Markup Language,可拓展标记语言)
XML的特点
XML的创建
XML的语法规则
XML文件的后缀名为 xml,文档声明必须是第一行
version: XML默认的版本号码、该属性是必须存在的
encoding: 本XML文件的编码
XML中可以定义注释信息:
XML中书写 “<”、“&” 等符号可能会出现冲突,导致报错,此时可以用如下特殊字符替代
< < 小于
> > 大于
& & 和号
' ' 单引号
" " 引号
XML 中可以写一个叫 CDATA 的数据区:,里面的内容可以随便写
例如,我们随便写一个 xml 文件,命名为 helloworld.xml
<users>
<user id="1" desc="第一个用户">
<name>张无忌name>
<sex>男sex>
<地址>光明顶地址>
<password>minminpassword>
<data> 3 < 2 && 5 > 4 data>
<data1>
4
]]>
data1>
user>
<people>很多人people>
<user id="2">
<name>敏敏name>
<sex>女sex>
<地址>光明顶地址>
<password>wujipassword>
<data> 3 < 2 && 5 > 4 data>
<data1>
4
]]>
data1>
user>
users>
我们可以通过浏览器来查看这个文件展示的内容,步骤:在 IDEA 的 xml 文件界面右键鼠标,选择 Open In → \rightarrow → Browser,接着选择一个浏览器打开即可,结果大致如下
XML的作用和应用场景
读取 XML 文件中的数据,业界内通常将其叫做解析 XML 文件
解析XML文件
注意:程序员并不需要自己写原始的 IO 流代码来解析 XML,难度较大,且相当繁琐
其实,现在有很多开源的、好用的解析 XML 的框架,最知名的是 Dom4j(第三方研发的)
使用 Dom4j 解析出 XML 文件的具体步骤
需求:使用 Dom4j 把一个 XML 文件的数据进行解析
分析:
DOM4J解析XML文件的思想:文档对象模型
Dom4j 解析 XML 得到 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 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文件中去
*
*
* 从入门到跑路
* dlei
* 999.9
*
*/
public class Dom4JTest2 {
public static void main(String[] args) {
// 1、使用一个StringBuilder对象来拼接XML格式的数据
StringBuilder sb = new StringBuilder();
sb.append("\r\n"); // \r\n为换行
sb.append("\r\n" );
sb.append("\t" ).append("从入门到跑路").append("\r\n");
sb.append("\t" ).append("dlei").append("\r\n");
sb.append("\t" ).append(999.99).append("\r\n");
sb.append("");
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的使用(了解)
需求:利用 DTD 约束文档,约束一个 XML 文件的编写
注意:DTD 文档只能约束 XML 文件的标签,不能约束标签里面内容的数据类型
应用(了解即可)
XML文档约束-Schema的使用(了解)
需求:利用 Schema 文档约束一个 XML 文件的编写
注意:可以约束 XML 文件的编写和数据类型
什么是日志?
在开发时,我们可能会遇到以下问题:
想解决上述问题,我们需要用到日志技术
日志就好比生活中的日记,可以记录你生活中的点点滴滴;而程序中的日志,通常就是一个文件,里面记录的是程序运行过程中的各种信息
以前记录日志的方案
public static void test(String number) {
try {
int result = Integer.parseInt(number);
System.out.println("输入的数字为" + result);
} catch(NumberFormatException e) {
System.out.printlnl("输入的数字有误,请输入一个整数");
}
}
之前,我们都是通过诸如捕获异常的方式,将日志信息展示在控制台上
这样做有以下弊端:
日志技术的特点
Logback 日志框架官网:http://logback.qos.ch/index.html
Logback 日志框架有以下几个模块:
如果想要使用 Logback 日志框架,至少需要在项目中整合如下三个模块:
对于目前的我们,是需要一个一个去下载的,过程也是比较麻烦,后面学了 maven 这个工具就不用我们自己下载了
需要的资源博主已经上传到 CDSN,点击此处免费下载
需求:使用 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>
什么是日志级别?
日志级别指的是日志信息的类型,日志都会分级别,常见的日志级别如下,优先级从上到下依次升高:
为什么要学习日志级别?
如果我们想让程序只记录 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>