Java进阶7 特殊文件与日志技术

特殊文件与日志技术

  • 导图总览
  • 一、属性文件
    • 1.1、特殊文件
    • 1.2、Properties属性文件
    • 1.3、XML文件
      • 1.3.1、XML解析
      • 1.3.2、XML文件写入
      • 1.3.3、XML约束
  • 二、日志技术
    • 2.1、什么是日志技术?
    • 2.2、日志框架
    • 2.3、Logback
    • 2.4、日志配置文件
    • 2.5、配置日志级别


导图总览

Java进阶7 特殊文件与日志技术_第1张图片

一、属性文件

1.1、特殊文件

IO流是用来读取、修改文件中的数据,但那些都是普通的文件,里面的数据没有任何格式规范,用户可以随意编写,这样不方便程序对文件中的数据信息进行处理。

Java中有着一些特殊的文本文件,这些文件有格式要求,方便程序对文件中的数据进行处理,比如:Properties文件与xml文件。

  • Properties:后缀为.properties的文件,称之为属性文件,它可以很方便的存储一些类似于键值对的数据,经常当做软件的配置文件使用。
  • xml:而xml文件能够表示更加复杂的数据关系,比如要表示多个用户的用户名、密码、家乡、性别等。在后面也经常当做软件的配置文件使用。

1.2、Properties属性文件

Properties是什么?

Properties是Map接口下面的一个实现类,所以Properties也是一种双列集合,用来存储键值对。但是一般不会把它当做集合来使用。

Properties的核心作用

Properties类的对象,用来表示属性文件,可以用来读取属性文件中的键值对。

Properties文件的格式

  1. 属性文件后缀以.properties结尾。
  2. 属性文件里的每一行都是一个键值对,键和值中间用 = 隔开。比如: admin = 1234。
  3. # 表示这样是注释信息,是用来解释这一行配置是什么意思。
  4. 每一行末尾不要习惯性加分号、空格等字符,不然会把分号、空格当做值的一部分。
  5. 键不能重复,值可以重复。
  • 使用Properties读取属性文件中的键值对

Java进阶7 特殊文件与日志技术_第2张图片

使用Properties读取属性文件的步骤如下

1. 创建一个Properties的对象出来(键值对,空容器)。
2. 调用load(字符输入流/字节输入流)方法,开始加载属性文件中的键值对数据到Properties对象中去。
3. 调用getProperty(键)方法,根据键取值。

Properties使用演示

import java.io.FileReader;
import java.util.Properties;
import java.util.Set;

public class Test01 {
    public static void main(String[] args) throws Exception {
        //1.创建一个Properties的对象出来(键值对集合,空容器)
        Properties properties = new Properties();
        System.out.println(properties);

        //2.开始加载属性文件中的键值对数据到properties对象中去
        properties.load(new FileReader("console.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往属性文件中写键值对,需要的方法如下

Java进阶7 特殊文件与日志技术_第3张图片

往Properties属性文件中写键值对的步骤如下:

1.先准备一个.properties属性文件,按照格式写几个键值对。
2.创建properties对象出来。
3.调用setProperty存储一些键值对数据。
4.调用store(字符输出流/字节输出流,注释),将properties集合中的键和值写到文件中。

注意:第二个参数是注释,必须得加。

案例演示

users.properties属性文件,如下所示:

Java进阶7 特殊文件与日志技术_第4张图片

编写代码读取上面的属性文件,代码实现如下:

import java.io.FileWriter;
import java.util.Properties;

public class Test01 {
    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("console.properties"),"i love Java");
    }
}

1.3、XML文件

什么是XML?

XML是可扩展的标记语言,意思是它是由一些标签组成的,而这些标签是自己定义的。本质上一种数据格式,用来表示复杂的数据关系。

XML文件特点

  • XML中的 <标签名> 称为一个标签或者一个元素,一般是成对出现的。
  • XML中的标签可以自己定义(可扩展),打不死必须要正确的嵌套。
  • XML中只能有一个根标签。
  • XML标准中可以有属性。
  • XML必须第一行有一个文档声明,格式是固定的
  • XML文件必须是以.xml为后缀结尾。

Java进阶7 特殊文件与日志技术_第5张图片


● XML的创建

Java进阶7 特殊文件与日志技术_第6张图片

<?xml version="1.0" encoding="UTF-8" ?>
<!-- 注释:以上抬头声明必须放在第一行,必须有 -->
<!--  根标签只能有一个 -->
<users>
    <user id="1" desc="第一个用户">
        <name>张无忌</name>
        <sex></sex>
        <地址>光明顶</地址>
        <password>minmin</password>
    </user>
    <people>很多人</people>
    <user id="2">
        <name>敏敏</name>
        <sex></sex>
        <地址>光明顶</地址>
        <password>wuji</password>
    </user>
</users>

标签有属性、文本、还有合理的嵌套。XML文件中除了写以上额数据格式之外,还有一些特殊的字符不能直接写。

  • 像<,>,& 等这些符号不能出现在标签的文本中,因为标签格式本身就有<>,会和标签格式冲突。如果标签文本中有这些特殊字符,需要用一些占位符代替。
<  表示 <
>  表示 >
& 表示 &
' 表示 '
" 表示 "
 3 < 2 && 5 > 4 
  • 如果在标签文本中,出现大量的特殊字符,不想使用特殊字符,此时可以用CAATA,格式如下:

     4
    ]]>


1.3.1、XML解析

XML解析:使用程序读取XML文件中的数据,称之为XML解析。

读取xml文件中的数据,不需要我们自己写IO流代码去读取,其实有很多开源的,好用的XML解析框架,最知名的事DOM4J(第三方开发)。

Java进阶7 特殊文件与日志技术_第7张图片

由于DOM4J是第三方提供的,所以要把第三方提供的Jar包导入到自己的项目中来,才可以使用,具体步骤如下所示:

Java进阶7 特殊文件与日志技术_第8张图片

DOM4J解析XML文件的思想是:文档对象模型(意思是把整个XML文档、每一个标签、每一个属性等都当做对象来看待)。Dowument对象表示整个XML文档、Element对象表示标签(元素)、Attribute对象表示属性、标签中的内容就是文本。

Java进阶7 特殊文件与日志技术_第9张图片

DOM4J解析XML文件需要用到的方法:

Java进阶7 特殊文件与日志技术_第10张图片

XML解析的过程,是从根元素开始,从外层往里层解析。我们先把Document对象,和根元素获取出来。

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());
    }
}

Java进阶7 特殊文件与日志技术_第11张图片

获取到XML文件的根元素之后,接下来,就可以用根元素在获取到它里面的子元素(包括子标签、表属性等)。需要用到的方法如下所示:

Java进阶7 特殊文件与日志技术_第12张图片

使用演示:

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("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()); // 取出文本去除前后空格
    }
}

1.3.2、XML文件写入

DOM4J中也提供了往XML中写标签的方法,但是用起来比较麻烦,所以使用StringBuilder按照标签的格式拼接,再使用BufferedWriter写到文件中:

public class Dom4JTest2 {
    public static void main(String[] args) {
        // 1、使用一个StringBuilder对象来拼接XML格式的数据。
        StringBuilder sb = new StringBuilder();
        sb.append("\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();
        }

    }
}

1.3.3、XML约束

什么是XML约束?

XML约束指的是限制XML文件中的标签或者属性,只能按照规定的格式写。

比如在项目中,想约束一个XML文件中的标签只能写<书>、<书名>、<作者>、<售价>这几个标签,如果写其他标签就会报错。

常用的约束

目前先学习一种约束技术:

  • DTD约束

DTD约束演示

Java进阶7 特殊文件与日志技术_第13张图片

DTD文件解释

   表示根标签是<书架>,并且书架中有子标签<书>
 表示书是一个标签,且书中有子标签<书名>、<作者>、<售价>
	表示<书名>是一个标签,且<书名>里面是普通文本
	表示<作者>是一个标签,且<作者>里面是普通文本
	表示<售价>是一个标签,且<售价>里面是普通文本

二、日志技术

2.1、什么是日志技术?

想了解什么是日志,那么不妨了解下面的几个问题:

  • 希望系统能记住某些数据被谁操作,比如被谁删除的?
  • 想分析用户浏览系统的具体情况,比如挖掘用户的具体喜好?
  • 当系统在开发中或者上线后出现了Bug,崩溃了,该通过什么去分析,定位Bug?

这些问题就可以通过日志来解决。

所以,日志就好比生活中的日记,记录生活中的点滴,而程序中的日志,通常就是一个文件,里面记录了程序运行过程中产生的各种数据。

● 日志技术的优点

  1. 日志可以将系统执行的信息,记录到指定位置,可以是控制台、可以是文件、可以是数据库中。
  2. 日志可以随时以开关的形式控制启停,无需侵入到源代码中去修改。

2.2、日志框架

日志框架:一些大牛或者第三方公司提供的,可直接拿来使用的成熟体系代码。

日志框架有很多种,比如:JU(java.util.logging)、Log4j、logback等。

Java进阶7 特殊文件与日志技术_第14张图片

  • 日志接口:设计日志框架的一套标准,日志框架需要实现这些接口。
  • 因为对Commons Logging接口不满意,有人就弄出了SLF4J;因为对Log4j的性能不满意,有人做出了Logback。
  • 注意点:Logback是基于slf4j的日志规范实现的框架。

2.3、Logback

在所有日志框架中,Logback使用较为广泛,所以重点介绍Logback。

● Logback的模块

Java进阶7 特殊文件与日志技术_第15张图片

想使用Logback日志框架,至少需要在项目中整合如下三个模块:

  1. slf4j - api:日志接口
  2. logback - core
  3. logback - classic

● 使用案例

使用Logback记录几条日志信息到文件中去和将日志信息打印在控制台上。

由于Logback是第三方提供的技术,所以首先需要将Jar包引入到项目中,具体步骤如下:

  1. 在资料中找到slftj-api.jar、logback-core.jar、logback-classes.jar 这三个jar包,复制一下

  2. 在当前模块下面新建一个lib文件夹,把刚刚复制的三个jar包都粘贴到此处

  3. 从资料中找到logback.xml配置文件,将此文件复制粘贴到src目录下(必须是src目录)

  4. 然后就可以开始写代码了,在代码中创建一个日志记录日对象

public static final Logger LOGGER = LoggerFactory.getLogger("当前类名");
  1. 开始记录文件。

代码如下

public class LogBackTest {
    // 创建一个Logger日志对象
    public static final Logger LOGGER = LoggerFactory.getLogger("LogBackTest");

    public static void main(String[] args) {
        //while (true) {
            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);
    }
}

当运行程序时,就可以看到控制台记录的日志

Java进阶7 特殊文件与日志技术_第16张图片
同时在文件中,也有一份这样的日志信息。

Java进阶7 特殊文件与日志技术_第17张图片
打开文件中查看是否有记录日志。

在这里插入图片描述


2.4、日志配置文件

Logback提供了一个核心配置文件logback.xml,日志框架在记录日志时会读取配置文件中的配置信息,从而记录日志的形式。具体可以做哪些配置?

  1. 可以配置日志输出的位置是文件、还是控制台
  2. 可以配置日志输出的格式
  3. 还可以配置日志关闭和开启、以及哪些日志输出哪些日志不输出。

● 如下图所示,控制日志往文件中输出,还是往控制台输出。

Java进阶7 特殊文件与日志技术_第18张图片

● 控制打开和关闭日志

Java进阶7 特殊文件与日志技术_第19张图片

● 控制日志的输出格式

日志格式是由一些特殊的符号组成,可以根据需要删减不想看到的部分。比如不想看到线程名,那就不要[%thread]。

Java进阶7 特殊文件与日志技术_第20张图片


2.5、配置日志级别

什么是日志级别?

日志级别指的是日志信息的类型,日志都会分级别,常见的日志级别如下(优先级依次升高

Java进阶7 特殊文件与日志技术_第21张图片

● 在哪配置日志级别?

Java进阶7 特殊文件与日志技术_第22张图片

● 注意:

Logback只输出大于或者等于核心配置文件配置的日志级别信息。小于配置级别的日志信息不会被记录。

配置的是trace,则trace、debug、info、warn、error级别的日志都被输出
配置的是debug, 则debug、info、warn、error级别的日志被输出
配置的是info,则info、warn、error级别的日志被输出
...

你可能感兴趣的:(java,开发语言,servlet,properties,xml)