特殊文本文件、日志技术

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中书写”<”、“&”等,可能会出现冲突,导致报错,此时可以用如下特殊字符替代。
&lt;    <  小于
&gt;    >  大于
&amp;   &  和号
&apos;  '  单引号
&quot;  "  引号
  • 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 &lt; 2 &amp;&amp; 5 &gt; 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>
  • 只有日志的级别是大于或等于核心配置文件配置的日志级别,才会被记录,否则不记录。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值