Java学习-19 特殊文件、日志技术概述

特殊文件Properties

Properties

是一个Map集合(键值对集合),但是我们一般不会当集合使用

核心作用:Properties是用来代表属性文件的,通过Properties可以读写属性文件里的内容

使用Properties读取属性文件里的键值对数据

public class PropertiesTest3 {
    public static void main(String[] args) throws IOException {
        // 把李芳改成18岁
        Properties properties = new Properties();
        properties.load(new FileReader("day19_properties-xml-log-app\\src\\users.txt"));
        // 判断是否包含李芳键
        if(properties.containsKey("李方")){
            properties.setProperty("李方", "18");
        }
        properties.store(new FileWriter("day19_properties-xml-log-app\\src\\users.txt"),
                "save");
        System.out.println(properties);
    }
}

XML(全程Extentsible Markup Language,可扩展标记语言)

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

XML的特点

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

XML的创建

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

XML的作用和应用场景

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

应用场景:经常用来做为系统的配置文件,或者做为一种特殊的数据结构,在网络中进行传输

解析XML文件

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

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

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

public class Dom4jTest1 {
    public static void main(String[] args) throws Exception {
        // 创建Dom4J 框架
        SAXReader saxReader = new SAXReader();

        //使用saxReader对象包需要解析的XML文件读成一个documnet对象
        Document document = saxReader.read("day19_properties-xml-log-app\\src\\helloworld.xml");
        // 拿到根元素
        Element root = document.getRootElement();
        System.out.println(root.getName());

        // 获取根元素下的子元素
//        List<Element> elements = root.elements();
        // 指定某个子元素
        List<Element> elements = root.elements("user");
        for (Element element : elements) {
            System.out.println(element.getName());
        }
        Element element = root.element("people");
        System.out.println(element.getText());

        // 如果有多个 使用element() 获取第一个
        Element user = root.element("user");
        System.out.println(user.elementText("name"));
        Attribute id = user.attribute("id");
        System.out.println(user.attributeValue("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());
        }
        // 获取子元素文本
        System.out.println(user.elementText("name"));
        System.out.println(user.elementText("地址"));
        System.out.println(user.elementText("password"));

        Element data = user.element("data");
        System.out.println(data.getText());
        System.out.println(data.getTextTrim());
    }
}

Dom4J写入xml

public class Dom4JTest2 {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder();
        sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\r\n");
        sb.append("<book>\r\n");
        sb.append("\t<name>").append("从入门到跑路").append("</name>\r\n");
        sb.append("\t<author>").append("dlei").append("</author>\r\n");
        sb.append("\t<price>").append("999").append("</price>\r\n");
        sb.append("</book>\r\n");

        try (BufferedWriter bw = new BufferedWriter(new FileWriter("day19_properties-xml-log-app\\src\\book.xml"))) {
            bw.write(String.valueOf(sb));
        } catch (Exception e){
            e.printStackTrace();
        }
    }
}

约束文档

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

约束文档的分类

DTD文档

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

<!DOCTYPE 书架 SYSTEM "data.dtd">导入

  1. 编写DTD约束文档,后缀必须是.dtd

  2. 在需要编写的XML文件中导入该DTD约束文档
  3. 然后XML文件,就必须按照DTD约束文档指定的格式进行编写,否则报错!

Schema文档

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

利用schema文档约束,约束一个XML文件的编写

  1. 编写schema约束文档,后缀必须是.xsd,具体的形式到代码中观看
  2. 在需要编写的XML文件中导入该schema约束文档
  3. 按照约束内容编写XML文件的标签

日志技术

可以将系统执行的信息,方便的记录到指定的位置(控制台,文件中,数据库中)

可以随时以开关的形式控制日志的启动,无需侵入到源代码中去进行修改

日志框架:牛人或第三方公司已经做好的实现代码,后来者直接可以拿去使用

日志接口:设计日志框架的一套标准,日志框架需要实现这些接口

注意1:因为对Commons Logging接口不满意,有人就搞了SLF4J;因为对Log4j的性能不满意,有人就搞了Logback。

注意2:Logback是基于slf4j的日志规范实现的框架

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

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

实现步骤

导入Logback框架到项目中

将Logback框架的核心配置文件logback.xml直接拷贝到src目录下(必需是src下)

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

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

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class LogBackTest {
    // 创建一个logger日志对象
    public static final Logger LOGGER = LoggerFactory.getLogger("logBackTest");
    public static void main(String[] args) {
        try {
            LOGGER.info("chu法方法开始执行~~~");
            chu(10,2);
            LOGGER.info("chu法方法执行完成~~~");
        } catch (Exception e) {
            e.printStackTrace();
            LOGGER.error("chu法方法出错了~~~");
        }
    }
    public static void chu(int a, int b){
        int c=a/b;
        System.out.println("结果是:" + c);
    }
}

logback.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!-- CONSOLE :表示当前的日志信息是可以输出到控制台的 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <!--输出流对象 默认 System.out 改为 System.err  其中err:控制台输出日志为红色,而out为黑色-->
        <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>
        <!--日志输出路径(output.log是文档名,下方还有一处文件名(不用写.log))-->
        <file>D:/log/com.dong.log</file>
        <!--指定日志文件拆分和压缩规则(防止文件过大)-->
        <rollingPolicy
                class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!--通过指定压缩文件名称,来确定分割文件方式-->
            <fileNamePattern>D:/log/com.dong-%d{yyyy-MMdd}.log%i.gz</fileNamePattern>
            <maxFileSize>1MB</maxFileSize> <!--文件拆分大小-->
        </rollingPolicy>
    </appender>

    <!--
    level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF (关掉), 默认debug(可忽略大小写)
    <root>可以包含零个或多个<appender-ref>元素,标识这个输出位置将会被本日志级别控制。
    -->
    <root level="INFO"> <!--打印规则:只打印不低于当前级别的日志-->
        <appender-ref ref="CONSOLE"/> <!--如果这个地方不配置关联打印的位置,改位置将不会记录日志-->
        <appender-ref ref="FILE"/>
    </root>
</configuration>

什么是日志级别

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

日志级别说明
trace追踪,指明程序运行轨迹
debug调试,实际应用中一般将其作为最低级别,而 trace 则很少使用
info输出重要的运行信息,数据连接、网络连接、IO操作等等,使用较多
warn警告信息,可能会发生问题,使用较多
error错误信息,使用较多

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

  • 13
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值