特殊文件Properties
Properties
是一个Map集合(键值对集合),但是我们一般不会当集合使用
核心作用:Properties是用来代表属性文件的,通过Properties可以读写属性文件里的内容
使用Properties读取属性文件里的键值对数据
public class PropertiesTest3 {
public static void main(String[] args) throws IOException {
// 把李芳改成18岁
Properties properties = new Properties();
properties.load(new FileReader("day19_properties-xml-log-app\\src\\users.txt"));
// 判断是否包含李芳键
if(properties.containsKey("李方")){
properties.setProperty("李方", "18");
}
properties.store(new FileWriter("day19_properties-xml-log-app\\src\\users.txt"),
"save");
System.out.println(properties);
}
}
XML(全程Extentsible Markup Language,可扩展标记语言)
本质是一种数据的格式,可以用来存储复杂的数据结构,和数据关系
XML的特点
- XML中的"<标签名>"成为一个标签或一个元素,一般是成对出现的
- XML中的标签名可以自己定义(可扩展),但必须要正确嵌套
- XML中只能有一个根标签
- XML中的标签可以有属性
- 如果一个文件中放置的是XML格式的数据,这个文件就是XML文件,后缀一般要写成.xml
XML的创建
就是创建一个XML类型的文件,要求文件后缀必须使用xml,如hello_world.xml
XML的作用和应用场景
本质是一种数据格式,可以存储复杂的数据结构,和数据关系
应用场景:经常用来做为系统的配置文件,或者做为一种特殊的数据结构,在网络中进行传输
解析XML文件
使用程序读取XML文件中的数据
注意:程序员并不需要自己写原始IO流代码来解析XML,难度较大!也相当繁琐
其实,有很多开源的,好用的,解析XML的框架,最知名的是:Dom4j(第三发研发的)
public class Dom4jTest1 {
public static void main(String[] args) throws Exception {
// 创建Dom4J 框架
SAXReader saxReader = new SAXReader();
//使用saxReader对象包需要解析的XML文件读成一个documnet对象
Document document = saxReader.read("day19_properties-xml-log-app\\src\\helloworld.xml");
// 拿到根元素
Element root = document.getRootElement();
System.out.println(root.getName());
// 获取根元素下的子元素
// List<Element> elements = root.elements();
// 指定某个子元素
List<Element> elements = root.elements("user");
for (Element element : elements) {
System.out.println(element.getName());
}
Element element = root.element("people");
System.out.println(element.getText());
// 如果有多个 使用element() 获取第一个
Element user = root.element("user");
System.out.println(user.elementText("name"));
Attribute id = user.attribute("id");
System.out.println(user.attributeValue("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());
}
// 获取子元素文本
System.out.println(user.elementText("name"));
System.out.println(user.elementText("地址"));
System.out.println(user.elementText("password"));
Element data = user.element("data");
System.out.println(data.getText());
System.out.println(data.getTextTrim());
}
}
Dom4J写入xml
public class Dom4JTest2 {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\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").append("</price>\r\n");
sb.append("</book>\r\n");
try (BufferedWriter bw = new BufferedWriter(new FileWriter("day19_properties-xml-log-app\\src\\book.xml"))) {
bw.write(String.valueOf(sb));
} catch (Exception e){
e.printStackTrace();
}
}
}
约束文档
专门用来限制xml书写格式的文档,比如:限制标签、属性应该怎么写。
约束文档的分类
DTD文档
利用DTD约束文档,约束一个XML文件的编写
<!DOCTYPE 书架 SYSTEM "data.dtd">导入
- 编写DTD约束文档,后缀必须是.dtd
- 在需要编写的XML文件中导入该DTD约束文档
- 然后XML文件,就必须按照DTD约束文档指定的格式进行编写,否则报错!
Schema文档
可以约束XML文件的编写和数据类型
利用schema文档约束,约束一个XML文件的编写
- 编写schema约束文档,后缀必须是.xsd,具体的形式到代码中观看
- 在需要编写的XML文件中导入该schema约束文档
- 按照约束内容编写XML文件的标签
日志技术
可以将系统执行的信息,方便的记录到指定的位置(控制台,文件中,数据库中)
可以随时以开关的形式控制日志的启动,无需侵入到源代码中去进行修改
日志框架:牛人或第三方公司已经做好的实现代码,后来者直接可以拿去使用
日志接口:设计日志框架的一套标准,日志框架需要实现这些接口
注意1:因为对Commons Logging接口不满意,有人就搞了SLF4J;因为对Log4j的性能不满意,有人就搞了Logback。
注意2:Logback是基于slf4j的日志规范实现的框架
想使用Logback日志框架,至少需要在项目中整合如下三个模块:
slf4j-api: 日志接口 logback-core logback-classic
实现步骤
导入Logback框架到项目中
将Logback框架的核心配置文件logback.xml直接拷贝到src目录下(必需是src下)
创建Logback框架提供的Logger对象,然后用Logger对象调用其提供的方法就可以记录系统的日志信息
public static final Logger LOGGER = LoggerFactory.getLogger(“类名");
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class LogBackTest {
// 创建一个logger日志对象
public static final Logger LOGGER = LoggerFactory.getLogger("logBackTest");
public static void main(String[] args) {
try {
LOGGER.info("chu法方法开始执行~~~");
chu(10,2);
LOGGER.info("chu法方法执行完成~~~");
} catch (Exception e) {
e.printStackTrace();
LOGGER.error("chu法方法出错了~~~");
}
}
public static void chu(int a, int b){
int c=a/b;
System.out.println("结果是:" + c);
}
}
logback.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- CONSOLE :表示当前的日志信息是可以输出到控制台的 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<!--输出流对象 默认 System.out 改为 System.err 其中err:控制台输出日志为红色,而out为黑色-->
<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>
<!--日志输出路径(output.log是文档名,下方还有一处文件名(不用写.log))-->
<file>D:/log/com.dong.log</file>
<!--指定日志文件拆分和压缩规则(防止文件过大)-->
<rollingPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--通过指定压缩文件名称,来确定分割文件方式-->
<fileNamePattern>D:/log/com.dong-%d{yyyy-MMdd}.log%i.gz</fileNamePattern>
<maxFileSize>1MB</maxFileSize> <!--文件拆分大小-->
</rollingPolicy>
</appender>
<!--
level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF (关掉), 默认debug(可忽略大小写)
<root>可以包含零个或多个<appender-ref>元素,标识这个输出位置将会被本日志级别控制。
-->
<root level="INFO"> <!--打印规则:只打印不低于当前级别的日志-->
<appender-ref ref="CONSOLE"/> <!--如果这个地方不配置关联打印的位置,改位置将不会记录日志-->
<appender-ref ref="FILE"/>
</root>
</configuration>
什么是日志级别
日志级别指的日志信息的类型,日志都会分级别,常见的日志级别如下(优先级依次升高):
日志级别 | 说明 |
trace | 追踪,指明程序运行轨迹 |
debug | 调试,实际应用中一般将其作为最低级别,而 trace 则很少使用 |
info | 输出重要的运行信息,数据连接、网络连接、IO操作等等,使用较多 |
warn | 警告信息,可能会发生问题,使用较多 |
error | 错误信息,使用较多 |
只有日志的级别是大于或等于核心配置文件配置的日志级别,才会被记录,否则不记录。