第十天、配置文件&日志&多线程
配置文件
介绍
配置文件
-
在企业开发过程中,我们习惯把一些需要灵活配置的数据放在一些文本文件中,而不是在Java代码写死
-
我们把这种存放程序配置信息的文件,统称为配置文件
-
配置文件一般要求有明确的格式,以方便读写操作!!!
这些特殊文件,我们主要学什么?
-
了解它们的特点、作用
-
学习使用程序读取它们里面的数据
-
学习使用程序把数据存储到这些文件里
Properties
Properties
-
是一个Map集合(键值对集合),但是我们一般不会当集合使用。
-
核心作用:Properties是用来代表属性文件的,通过Properties可以读写属性文件里的内容。
使用Properties读取属性文件里的键值对数据
使用Properties把键值对数据写出到属性文件里去
XML
认识XML
XML
-
全称Extensible Markup Language, 可扩展标记语言
-
本质是一种数据的格式,可以用来存储复杂的数据结构,和数据关系。
XML的特点
-
XML中的“<标签名>” 称为一个标签或一个元素,一般是成对出现的。
-
XML中的标签名可以自己定义(可扩展),但必须要正确的嵌套。
-
XML中只能有一个根标签。
-
XML中的标签可以有属性。
-
如果一个文件中放置的是XML格式的数据,这个文件就是XML文件,后缀一般要写成.xml。
XML的语法规则
-
XML文件的后缀名为:xml,文档声明必须是第一行
-
XML中可以定义注释信息:<!--- 注释内容 -->,快捷键是Ctrl+shift+/
-
XML中书写”<”、“&”等,可能会出现冲突,导致报错,此时可以用如下特殊字符替代。
-
XML中可以写一个叫CDATA的数据区: <![CDATA[ …内容… ]]>,里面的内容可以随便写。
XML的作用和应用场景
-
本质是一种数据格式,可以存储复杂的数据结构,和数据关系。
-
应用场景:经常用来做为系统的配置文件;或者作为一种特殊的数据结构,在网络中进行传输。
读取XML
解析XML文件
-
使用程序读取XML文件中的数据
-
注意:程序员并不需要自己写原始的IO流代码来解析XML,难度较大!也相当繁琐!
-
其实,有很多开源的,好用的,解析XML的框架,最知名的是:Dom4j(第三方研发的)
DOM4J解析XML文件的思想:文档对象模型
Dom4j解析XML-得到Document对象
-
SAXReader:Dom4j提供的解析器,可以认为是代表整个Dom4j框架
-
Document
Element提供的方法
约束XML
什么是约束XML文件的书写?
-
就是限制XML文件只能按照某种格式进行书写
约束文档
-
专门用来限制xml书写格式的文档,比如:限制标签、属性应该怎么写。
约束文档的分类(了解)
-
DTD文档 Schema文档
日志技术
概述
什么是日志
-
好比生活中的日记,可以记录你生活中的点点滴滴。
-
程序中的日志,通常就是一个文件,里面记录的是程序运行过程中的各种信息。
目前记录日志的方案
输出语句的弊端
-
日志会展示在控制台
-
不能更方便的将日志记录到其他的位置(文件,数据库)
-
想取消日志,需要修改源代码才可以完成
日志技术
-
可以将系统执行的信息,方便的记录到指定的位置(控制台、文件中、数据库中)。
-
可以随时以开关的形式控制日志的启停,无需侵入到源代码中去进行修改。
日志技术的体系结构
-
日志接口:设计日志框架的一套标准,日志框架需要实现这些接口。
-
日志框架:牛人或者第三方公司已经做好的实现代码,后来者直接可以拿去使用。
-
注意1:因为对Commons Logging接口不满意,有人就搞了SLF4J;因为对Log4j的性能不满意,有人就搞了Logback。
-
注意2:Logback是基于slf4j的日志规范实现的框架。
Logback日志框架官方网站:
Logback日志框架有以下几个模块:
想使用Logback日志框架,至少需要在项目中整合如下三个模块:
-
slf4j-api : 日志接口 logback-core logback-classic
Logback
Logback快速入门
需求
-
使用Logback日志框架,纪录系统的运行信息。
实现步骤
①:导入Logback框架到项目中去。slf4j-api : 日志接口 logback-core logback-classic ②:将Logback框架的核心配置文件logback.xml直接拷贝到src目录下(必须是src下)。 ③:创建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>
-
只有日志的级别是大于或等于核心配置文件配置的日志级别,才会被记录,否则不记录。
多线程
多线程介绍
什么是线程?
-
线程:简单的说,就是计算机在做一件事
-
单线程:在计算机中同一时间只能做一件事
-
多线程:在计算机中同一时间可以做多件事
-
它的主要好处有:1. 减少队列阻塞带来的影响 2. 提高CPU的利用率
线程的创建方式
-
继承Thread类
多线程的创建方式一:继承Thread类
-
定义一个子类继承线程类java.lang.Thread,重写run()方法
-
创建子类的对象 调用子类对象的start()方法启动线程(底层会自动去执行
-
run方法)
方式一优缺点
-
优点:编码简单
-
缺点:线程类已经继承Thread,无法继承其他类,不利于功能的扩展。
多线程注意事项
-
1、启动线程必须是调用start方法,不是调用run方法。
-
2、不要把主线程任务放在启动子线程之前。
-
直接调用run方法会当成普通方法执行,此时相当于还是单线程执行。
-
只有调用start方法才是启动一个新的线程执行。
-
这样主线程一直是先跑完的,相当于是一个单线程的效果了。
-
实现Runnable接口
多线程的创建方式二:实现Runnable接口
-
定义一个线程任务类实现Runnable接口,重写run()方法
-
创建任务类对象
-
把任务类对象交给Thread处理
-
调用线程对象的start()方法启动线程
方式二的优缺点
-
优点:任务类只是实现接口,可以继续继承其他类、实现其他接口,扩展性强。
-
缺点:需要多一个Runnable对象。
线程创建方式二的匿名内部类写法
-
可以创建Runnable的匿名内部类对象。
-
再交给Thread线程对象。
-
再调用线程对象的start()启动线程。
前两种线程创建方式存在一个问题
-
假如线程执行完毕后有一些数据需要返回,他们重写的run方法均不能直接返回结果。
怎么解决这个问题
-
JDK 5.0提供了Callable接口和FutureTask类来实现(多线程的第三种创建方式)。
-
这种方式最大的优点:可以返回线程执行完毕后的结果。
-
实现Callable
多线程的第三种创建方式:利用Callable接口、FutureTask类来实现。
-
创建任务对象 : 定义一个类实现Callable接口,重写call方法,封装要做的事情,和要返回的数据。 把Callable类型的对象封装成FutureTask(线程任务对象)。
-
把线程任务对象交给Thread对象。
-
调用Thread对象的start方法启动线程。
-
线程执行完毕后、通过FutureTask对象的的get方法去获取线程任务执行的结果。
FutureTask的API
线程创建方式三的优缺点
-
优点:线程任务类只是实现接口,可以继续继承类和实现接口,扩展性强;可以在线程执行完毕后去获取线程执行的结果。
-
缺点:编码复杂一点。
Thread类的方法
Thread提供了很多与线程操作有关的方法
获取线程名称、设置线程名称、拿到当前线程对象
线程休眠、线程join