【Java从入门到大牛】特殊文本文件和日志技术

本文由 程序喵正在路上 原创,CSDN首发!
系列专栏:Java从入门到大牛
首发时间:2023年10月27日
欢迎关注点赞收藏留言
不努力,你来这个世界当间谍的吗

目录

  • 文件的种类
  • 特殊文件:Properties属性文件
  • 特殊文件:XML文件
    • 概述
    • 读取XML文件中的数据
    • 补充知识:约束XML文件的编写 [了解即可]
  • 日志技术
    • 概述
    • 日志技术体系、Logback日志框架的概述
    • Logback快速入门
    • Logback设置日志级别

文件的种类

  • 普通文件

    【Java从入门到大牛】特殊文本文件和日志技术_第1张图片

  • 属性文件

    【Java从入门到大牛】特殊文本文件和日志技术_第2张图片

  • XML文件

    【Java从入门到大牛】特殊文本文件和日志技术_第3张图片

特殊文件:Properties属性文件

Properties属性文件的特点

  1. 存储的每一行内容都只能是键值对
  2. 键不能重复
  3. 文件后缀一般是 .properties 结尾

【Java从入门到大牛】特殊文本文件和日志技术_第4张图片

  • Properties 是一个 Map 集合(键值对集合),但是我们一般不会当集合使用
  • 核心作用:Properties 是用来代表属性文件的,通过 Properties 可以读写属性文件里的内容

使用Properties读取属性文件里的键值对数据
【Java从入门到大牛】特殊文本文件和日志技术_第5张图片

具体应用

首先,我们需要准备一个文件来读取,在项目的 src 目录下新建一个 File,命名为 users.properties

【Java从入门到大牛】特殊文本文件和日志技术_第6张图片

然后,我们就可以写代码来读取它了

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

/**
 * 目标:掌握使用Properties类读取属性文件中的键值对信息
 */
public class PropertiesTest1 {
    public static void main(String[] args) throws Exception {
        // 1、创建一个Properties的对象出来(键值对集合,空容器)
        Properties properties = new Properties();
        System.out.println(properties);

        // 2、开始加载属性文件中的键值对数据到properties对象中去
        properties.load(new FileReader("properties-xml-log-app\\src\\users.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);
        });
    }
}

【Java从入门到大牛】特殊文本文件和日志技术_第7张图片

使用Properties把键值对数据写出到属性文件里去

【Java从入门到大牛】特殊文本文件和日志技术_第8张图片
具体应用

import java.io.FileWriter;
import java.util.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对象中的键值对数据存入到属性文件中去
        properties.store(new FileWriter("properties-xml-log-app/src/users2.properties")
                , "i saved many users!");

    }
}

【Java从入门到大牛】特殊文本文件和日志技术_第9张图片

特殊文件:XML文件

概述

XML(全称EXtensible Markup Language,可拓展标记语言)

  • 本质是一种数据的格式,可以用来存储复杂的数据结构和数据关系

    【Java从入门到大牛】特殊文本文件和日志技术_第10张图片

XML的特点

  • XML 中的 “<标签名>” 称为一个标签或一个元素,一般是成对出现的
  • XML 中的标签名可以自己定义(可扩展),但必须要正确的嵌套
  • XML 中只能有一个根标签
  • XML 中的标签可以有属性
  • 如果一个文件中放置的是 XML 格式的数据,这个文件就是 XML 文件,后缀一般要写成 .xml

XML的创建

  • 就是创建一个 XML 类型的文件,要求文件的后缀必须使用 xml,如 hello_world.xml

IDEA创建XML文件
【Java从入门到大牛】特殊文本文件和日志技术_第11张图片

XML的语法规则

  • XML文件的后缀名为 xml,文档声明必须是第一行

    
    version: XML默认的版本号码、该属性是必须存在的
    encoding: 本XML文件的编码
    
  • XML中可以定义注释信息:

  • XML中书写 “<”、“&” 等符号可能会出现冲突,导致报错,此时可以用如下特殊字符替代

    <	< 小于
    >	> 大于
    &	& 和号
    '	' 单引号
    "	" 引号
    
  • XML 中可以写一个叫 CDATA 的数据区:,里面的内容可以随便写

例如,我们随便写一个 xml 文件,命名为 helloworld.xml




<users>
    <user id="1" desc="第一个用户">
        <name>张无忌name>
        <sex>sex>
        <地址>光明顶地址>
        <password>minminpassword>
        <data> 3 < 2 && 5 > 4 data>
        <data1>
             4
            ]]>
        data1>
    user>
    <people>很多人people>
    <user id="2">
        <name>敏敏name>
        <sex>sex>
        <地址>光明顶地址>
        <password>wujipassword>
        <data> 3 < 2 && 5 > 4 data>
        <data1>
             4
            ]]>
        data1>
    user>
users>

我们可以通过浏览器来查看这个文件展示的内容,步骤:在 IDEA 的 xml 文件界面右键鼠标,选择 Open In → \rightarrow Browser,接着选择一个浏览器打开即可,结果大致如下

【Java从入门到大牛】特殊文本文件和日志技术_第12张图片

XML的作用和应用场景

  • 本质是一种数据格式,可以存储复杂的数据结构和数据关系
  • 应用场景:经常用来作为系统的配置文件;或者作为一种特殊的数据结构,在网络中进行传输

读取XML文件中的数据

读取 XML 文件中的数据,业界内通常将其叫做解析 XML 文件

解析XML文件

  • 使用程序读取 XML 文件中的数据

注意:程序员并不需要自己写原始的 IO 流代码来解析 XML,难度较大,且相当繁琐

其实,现在有很多开源的、好用的解析 XML 的框架,最知名的是 Dom4j(第三方研发的)

使用 Dom4j 解析出 XML 文件的具体步骤

需求:使用 Dom4j 把一个 XML 文件的数据进行解析

分析:

  1. 下载 Dom4j 框架,官网下载可能比较慢,建议直接在 CSDN 搜索 “dom4j下载”,有众多教程任君选择
  2. 在项目中创建一个文件夹 Directory,建议命名为 lib
  3. 将 dom4j-2.1.3.jar 文件复制到 lib 文件夹
  4. 在 jar 文件上点击右键,选择 Add as Library,然后再点击 OK
  5. 在类中导包使用

DOM4J解析XML文件的思想:文档对象模型

【Java从入门到大牛】特殊文本文件和日志技术_第13张图片

Dom4j 解析 XML 得到 Document 对象

  • SAXReader:Dom4j 提供的一个解析器,可以认为是代表整个 Dom4j 框架
    【Java从入门到大牛】特殊文本文件和日志技术_第14张图片

  • Document
    【Java从入门到大牛】特殊文本文件和日志技术_第15张图片

Element 提供的方法

【Java从入门到大牛】特殊文本文件和日志技术_第16张图片

具体应用

对前面写的 helloworld.xml 进行解析

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.util.List;

/**
 * 目标:掌握使用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("properties-xml-log-app\\src\\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()); // 取出文本去除前后空格
    }
}

执行结果如下

【Java从入门到大牛】特殊文本文件和日志技术_第17张图片

如何使用程序把数据写出到XML文件中去呢

不建议使用 dom4j 来做,推荐直接把程序里的数据拼接成 XML 格式,然后用 IO 流写出去

例如

import java.io.BufferedWriter;
import java.io.FileWriter;

/**
 * 目标:如何使用程序把数据写出到 XML文件中去
 * 
 * 
 *     从入门到跑路
 *     dlei
 *     999.9
 * 
 */
public class Dom4JTest2 {
    public static void main(String[] args) {
        // 1、使用一个StringBuilder对象来拼接XML格式的数据
        StringBuilder sb = new StringBuilder();
        sb.append("\r\n");   // \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();
        }
    }
}

【Java从入门到大牛】特殊文本文件和日志技术_第18张图片

补充知识:约束XML文件的编写 [了解即可]

什么是约束XML文件的书写?

就是限制XML文件只能按照某种格式进行书写

什么是约束文档

专门用来限制 XML 书写格式的文档,比如:限制标签、属性应该怎么写

约束文档的分类

  • DTD文档
  • Schema文档

XML文档约束-DTD的使用(了解)

需求:利用 DTD 约束文档,约束一个 XML 文件的编写

  1. 编写 DTD 约束文档,后缀必须是 .dtd(了解即可,不用学会写)
  2. 在需要编写的 XML 文件中导入该 DTD 约束文档
  3. 然后 XML 文件就必须按照 DTD 约束文档指定的格式进行编写,否则会报错

注意:DTD 文档只能约束 XML 文件的标签,不能约束标签里面内容的数据类型

应用(了解即可)

【Java从入门到大牛】特殊文本文件和日志技术_第19张图片

XML文档约束-Schema的使用(了解)

需求:利用 Schema 文档约束一个 XML 文件的编写

  1. 编写 Schema 约束文档,后缀必须是 .xsd
  2. 在需要编写的 XML 文件中导入该 Schema 约束文档
  3. 按照约束内容编写 XML 文件的内容

注意:可以约束 XML 文件的编写和数据类型

【Java从入门到大牛】特殊文本文件和日志技术_第20张图片

日志技术

概述

什么是日志?

在开发时,我们可能会遇到以下问题:

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

想解决上述问题,我们需要用到日志技术

日志就好比生活中的日记,可以记录你生活中的点点滴滴;而程序中的日志,通常就是一个文件,里面记录的是程序运行过程中的各种信息

以前记录日志的方案

public static void test(String number) {
	try {
		int result = Integer.parseInt(number);
		System.out.println("输入的数字为" + result);
	} catch(NumberFormatException e) {
		System.out.printlnl("输入的数字有误,请输入一个整数");
	}
}

之前,我们都是通过诸如捕获异常的方式,将日志信息展示在控制台上

这样做有以下弊端:

  • 日志会展示在控制台,控制台关闭日志信息就丢失了
  • 不能更方便地将日志记录到其他位置,比如文件中或数据库中
  • 如果想取消日志,还需要修改源代码才可以完成

日志技术的特点

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

日志技术体系、Logback日志框架的概述

【Java从入门到大牛】特殊文本文件和日志技术_第21张图片

  • 日志框架:牛人或者第三方公司已经做好的实现代码,后来者直接可以拿去使用
  • 日志接口:设计日志框架的一套标准,日志框架需要实现这些接口
  • 注意1:因为对 Commons Logging 接口不满意,有人就搞了 SLF4J;因为对 Log4j 的性能不满意,有人就搞了 Logback
  • 注意2Logback 是基于 slf4j 的日志规范实现的框架

Logback 日志框架官网:http://logback.qos.ch/index.html

Logback 日志框架有以下几个模块:

【Java从入门到大牛】特殊文本文件和日志技术_第22张图片

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

  • slf4j-api:日志接口
  • logback-core
  • logback-classic

对于目前的我们,是需要一个一个去下载的,过程也是比较麻烦,后面学了 maven 这个工具就不用我们自己下载了

需要的资源博主已经上传到 CDSN,点击此处免费下载

Logback快速入门

需求:使用 Logback 日志框架,记录系统的运行信息

实现步骤:

  1. 导入 Logback 框架到项目中去,也就是前面提到的那三个模块

  2. 将 Logback 框架的核心配置文件 logback.xml 直接拷贝到 src 目录下(必须是 src 下),记住,logback.xml 不需要我们自己写,以后工作的时候公司会给

  3. 创建 Logback 框架提供的 Logger 对象,然后用 Logger 对象调用其提供的方法就可以记录系统的日志信息

    public static final Logger LOGGER = LoggerFactory.getLogger("类名");
    

应用演示

import org.slf4j.Logger;	// 注意必须是 slf4j 包下的 Logger
import org.slf4j.LoggerFactory;

/**
 * 目标:掌握LogBack日志框架的使用
 */
public class LogBackTest {
    // 创建一个Logger日志对象
    public static final Logger LOGGER = LoggerFactory.getLogger("LogBackTest");

    public static void main(String[] args) {
            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从入门到大牛】特殊文本文件和日志技术_第23张图片

核心配置文件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设置日志级别

什么是日志级别?

日志级别指的是日志信息的类型,日志都会分级别,常见的日志级别如下,优先级从上到下依次升高
【Java从入门到大牛】特殊文本文件和日志技术_第24张图片

为什么要学习日志级别?

如果我们想让程序只记录 info 及以上级别的日志,那我们就需要用到日志级别了

比如,我们将 level 改为 info

// 只记录 info warn error 日志
<root level="info">
    <appender-ref ref="CONSOLE"/>
    <appender-ref ref="FILE" />
root>

只有日志的级别是大于或等于核心配置文件配置的日志级别,才会被记录,否则不记录

如果不想让日志输出到控制台或者文件中,我们可以删除下面任一语句

// 只输出到控制台中
<root level="info">
    <appender-ref ref="CONSOLE"/>
root>

// 只输出到文件中
<root level="info">
    <appender-ref ref="FILE" />
root>

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