Java学习笔记——第十九天
特殊文本文件、日志技术
概述
特殊文件
- 属性文件:.properties
- XML文件:.xml
作用
- 存储有关系的数据,做为系统的配置文件。
- 做为信息进行传输。
日志技术
把程序运行的信息,记录到文件中,方便程序员定位bug,并了解程序的执行情况等。
特殊文件:Properties属性文件
特点
- 都只能是键值对。
- 键不能重复。
- 文件后缀一般是.properties结尾的。
作用
在文件里保存和读取键值对数据。
Properties类
- Properties类是一个Map集合(键值对集合),但是我们一般不会当集合使用。
- 核心作用:Properties是用来代表属性文件的,通过Properties可以读写属性文件里的内容。
使用Properties读取属性文件里的键值对数据
| 构造器 | 说明 |
|---|---|
| public Properties() | 用于构建Properties集合对象(空容器) |
| 常用方法 | 说明 |
|---|---|
| public void load(InputStream is) | 通过字节输入流,读取属性文件里的键值对数据 |
| public void load(Reader reader) | 通过字符输入流,读取属性文件里的键值对数据 |
| public String getProperty(String key) | 根据键获取值(其实就是get方法的效果) |
| public Set<String> stringPropertyNames() | 获取全部键的集合(其实就是ketSet方法的效果) |
使用Properties把键值对数据写出到属性文件里去
| 构造器 | 说明 |
|---|---|
| public Properties() | 用于构建Properties集合对象(空容器) |
| 常用方法 | 说明 |
|---|---|
| public Object setProperty(String key, String value) | 保存键值对数据到Properties对象中去 |
| public void store(OutputStream os, String comments) | 把键值对数据通过字节输出流写出到属性文件里去,需要写注释 |
| public void store(Writer w, String comments) | 把键值对数据通过字符输出流写出到属性文件里去,需要写注释 |
特殊文件:XML文件
XML( EXtensible Markup Language, 可扩展标记语言 )本质是一种数据的格式,可以用来存储复杂的数据结构和数据关系。
XML的特点
- XML中的“<标签名>” 称为一个标签或一个元素,一般是成对出现的。
- XML中的标签名可以自己定义(可扩展),但必须要正确的嵌套。
- XML中有且只能有一个根标签。
- XML中的标签可以有属性。
- 如果一个文件中放置的是XML格式的数据,这个文件就是XML文件,后缀一般要写成.xml。
XML的创建
就是创建一个XML类型的文件,要求文件的后缀必须使用xml,如hello_world.xml。
IDEA创建XML文件的步骤
- 右键src目录。
- 选择new。
- 点击file
- 输入文件名,后缀必须是xml,之后按以下回车即可。
XML的语法规则
- XML文件的后缀名为:xml,第一行必须是文档声明:
<?xml version="1.0" encoding="UTF-8" ?>
<!-- version:XML默认的版本号码、该属性是必须存在的。 -->
<!-- encoding:本XML文件的编码。 -->
- XML中可以定义注释信息:
<!-- 注释内容 -->
- XML中书写”<”、“&”等,可能会出现冲突,导致报错,此时可以用如下特殊字符替代。
< < 小于
> > 大于
& & 和号
' ' 单引号
" " 引号
- XML中可以写一个叫CDATA的数据区,里面的内容可以随便写,如下所示。
<![CDATA[ …内容… ]]>
XML的作用和应用场景
- 本质是一种数据格式,可以存储复杂的数据结构,和数据关系。
- 应用场景:经常用来做为系统的配置文件;或者作为一种特殊的数据结构,在网络中进行传输。
读取XML文件中的数据
- 使用程序读取XML文件中的数据。
- 注意:程序员并不需要自己写原始的IO流代码来解析XML,有很多开源的,好用的,解析XML的框架,最知名的是:dom4j(第三方研发的)。
导入dom4j框架的步骤
- 在官网下载dom4j框架。
- 在项目中创建一个文件夹:lib。
- 将dom4j-(版本号).jar文件复制到 lib 文件夹。
- 在jar文件上点右键,选择 Add as Library -> 点击OK。
- 在类中导包使用。
dom4j解析XML文件的思想:文档对象模型
- 首先通过SAXReader解析器将xml文件的全部内容加载到内存中成为Doucument对象。
- 通过Document对象获取代表元素(标签)的Element对象。
- 通过Element对象获取代表属性的Attribute对象及其子元素和文本。
dom4j解析XML-得到Document对象
- SAXReader:dom4j提供的解析器,可以认为是代表整个dom4j框架
| 构造器/方法 | 说明 |
|---|---|
| public SAXReader() | 构建dom4j的解析器对象 |
| public Document read(String url) | 把XML文件读成Document对象 |
| public Document read(InputStream is) | 通过字节输入流读取XML文件 |
- Document
| 方法名 | 说明 |
|---|---|
| Element getRootElement() | 获得根元素对象 |
Element提供的方法
| 方法名 | 说明 |
|---|---|
| public String getName() | 得到元素名字 |
| public List<Element> elements() | 得到当前元素下所有子元素 |
| public List<Element> elements(String name) | 得到当前元素下指定名字的子元素返回集合 |
| public Element element(String name) | 得到当前元素下指定名字的子元素,如果有很多名字相同的返回第一个 |
| public List<Element> attributes() | 得到当前元素下所有属性 |
| public String attributeValue(String name) | 通过属性名直接得到属性值 |
| public String elementText(子元素名) | 得到指定名称的子元素的文本 |
| public String getText() | 得到文本 |
把数据写入XML文件
- 不建议用dom4j做,因为非常繁琐。
- 推荐直接把程序里的数据拼接成XML格式,然后用IO流写出去。
约束XML文件的编写
-
约束XML文件就是限制XML文件只能按照某种格式进行书写。
-
作用:防止XML文件格式被更改后出现解析错误。
约束文档
约束文档是专门用来限制xml书写格式的文档,比如:限制标签、属性应该怎么写。
约束文档的分类
- DTD文档。
- Schema文档。
DTD
可以约束XML文件的编写,但不能约束具体的数据类型。
DTD文档的使用步骤
- 编写DTD约束文档,后缀必须是.dtd,格式如下:
<!ELEMENT 书架 (书+)>
<!ELEMENT 书 (书名,作者,售价)>
<!ELEMENT 书名 (#PCDATA)>
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 售价 (#PCDATA)>
-
在需要编写的XML文件中导入该DTD约束文档。
-
然后XML文件,就必须按照DTD约束文档指定的格式进行编写,否则就会报错。
Schema
可以约束XML文件的编写,也可以约束具体的数据类型。
Schema文档的使用步骤
- 编写schema约束文档,后缀必须是.xsd。
- 在需要编写的XML文件中导入该schema约束文档。
- 按照约束内容编写XML文件的标签。
日志技术
- 程序中的日志,通常就是一个文件,里面记录的是程序运行过程中的各种信息,并可以进行永久存储。
- 可以将系统执行的信息,方便的记录到指定的位置(控制台、文件中、数据库中)。
- 可以随时以开关的形式控制日志的启停,无需进入到源代码中去进行修改。
输出语句与日志技术的对比
| 输出语句 | 日志技术 | |
|---|---|---|
| 输出位置 | 输出到控制台 | 可以将日志信息写入到文件或者数据库中 |
| 取消日志 | 需要修改代码,灵活性比较差 | 不需要修改代码,灵活性比较好 |
| 多线程 | 性能较差 | 性能较好 |
日志技术的体系结构

- 日志框架:开发者或者公司已经做好的实现代码,后来者直接可以拿去使用。
- 日志接口:设计日志框架的一套标准,日志框架需要实现这些接口。
- 注意1:因为对Commons Logging接口不满意,有人就做了SLF4J;因为对Log4j的性能不满意,有人就做了Logback。
- 注意2:Logback是基于slf4j的日志规范实现的框架。
Logback日志框架
Logback日志框架官方网站
Logback日志框架的模块
-
logback-core:基础模块,是其他两个模块依赖的基础(必须有)。
-
logback-classic:功能模块,完整实现了slf4j API的模块(必须有)。
-
logback-access :与 Tomcat 和 Jetty 等 Servlet 容器集成,以提供 HTTP 访问日志的功能(可选)。
想使用Logback日志框架,至少需要在项目中整合如下三个模块
-
slf4j-api:日志接口
-
logback-core
-
logback-classic
使用Logback日志框架记录日志的具体步骤
- 在项目下新建文件夹lib,导入Logback的相关jar包(slf4j-api、ogback-core和logback-classic)到该文件夹下,并添加到项目库中去。
- 将Logback框架的核心配置文件logback.xml直接拷贝到src目录下(必须是src下)。
- 在代码中创建Logback框架提供的Logger对象:
public static final Logger LOGGER = LoggerFactory.getLogger(“类名");
- 调用日志对象的方法记录日志信息。
核心配置文件logback.xml
核心配置文件logback.xml是对Logback日志框架进行控制的。
日志的输出位置、输出格式的设置
通常可以设置2个输出日志的位置:一个是控制台、一个是系统文件中。
<!--File表示当前的日志信息是可以输出到控制台的-->
<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/data.log</file>
<!--指定日志文件拆分和压缩规则-->
<rollingPolicy
class="ch.qos.logback.ccore.rolling.SizeAndTimeBasedRollingPolicy">
<!--通过指定压缩文件名称,来确定文件分割方式-->
<fileNamePattern>D:/log/data-%i-%d{yyyy-MM-dd}-.log.gz</fileNamePattern>
<!--文件拆分大小-->
<maxFileSize>1MB</maxFileSize>
</rollingPolicy>
</appender>
开启日志(ALL),关闭日志(OFF)
<root level=“ALL">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE" />
</root>
日志级别
日志级别指的是日志信息的类型,用于控制系统中哪些日志级别是可以输出的。日志都会分级别,常见的日志级别如下(优先级依次升高):
| 日志级别 | 说明 |
|---|---|
| trace | 追踪,指明程序运行轨迹 |
| debug | 调试,实际应用中一般将其作为最低级别,而trace则很少使用 |
| info | 输出重要的运行信息,数据连接、网络连接、IO操作等等,使用较多 |
| warn | 警告信息,可能会发生问题,使用较多 |
| error | 错误信息, 使用较多 |
设置日志级别
- 在核心配置文件logback.xml中开启日志和闭日志的地方设置日志级别。
- 只有日志的级别是大于或等于核心配置文件配置的日志级别,才会被记录,否则不记录。
- 默认级别是debug(忽略大小写)。
<root level=“info">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE" />
</root>

浙公网安备 33010602011771号