Java基础 - 11 - 特殊文本文件、日志技术

一. 特殊文件

1.1 文件类型

普通文件.txt :

        普通文件里面的内容随意,格式随意

特殊文件:

        · 属性文件.properties :

                属性文件的内容都只能是键值对,键不能重复,文件后缀一般是.properties结尾,文件中#是注释

        · XML文件.xml :

                XML文件的内容是包裹在开始标签和结束标签中的,文件中<!-- -->是注释

1.1.1 为什么要用特殊文件?

        · 存储有关系的数据,作为系统的配置文件

        · 作为信息进行传输

1.2 Properties属性文件

1.2.1 Properties

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

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

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

这里要注意:properties属性文件在idea里的编码方式要和其他文件的编码方式(UTF-8)一致,才不会出现乱码

解决方案:顶部菜单栏FIle(文件)->下拉菜单Settings(设置)->设置窗口Editor(编辑器)->下拉菜单File Encodings(文本编码)->选项卡中Properties Files选项下拉菜单中的UTF-8->OK

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

        //开始加载属性文件中的键值对数据到properties对象中去
        properties.load(new FileReader("demo\\src\\com\\wosun\\File\\user.properties"));
        System.out.println(properties);

        //根据键取值
        System.out.println(properties.getProperty("张三"));

        System.out.println("=============================");
        
        //遍历全部的键和值
        Set<String> keys = properties.stringPropertyNames(); //拿到全部的键
        for (String key : keys) {
            String value = properties.getProperty(key);
            System.out.println(key + ":" + value);
        }

        System.out.println("=============================");
        properties.forEach((k,v) -> System.out.println(k+":"+v));
    }
}


//user.properties

# 这里存放的是用户名和密码
admin=123456
张三=zs123
李四=ls256
王五=ww897

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

//demo2
public class demo2 {
    public static void main(String[] args) throws IOException {
        //1.创建Properties对象出来,先用它存储一些键值对数据
        Properties properties = new Properties();
        properties.setProperty("周一","zhouyi");
        properties.setProperty("周二","zhouer");
        properties.setProperty("周三","zhousan");

        //2.把properties对象中的键值对数据存入到属性文件中去
        properties.store(new FileWriter("demo\\src\\com\\wosun\\File\\user2.properties"),"I saved some users!");
    }
}

1.2.4 案例:查看txt文件中是否存在某个键,存在则修改它对应的值

//demo3
public class demo3 {
    public static void main(String[] args) throws Exception {
        //1.加载属性文件(user.txt)的键值对到程序中来
        Properties properties = new Properties(); //空的集合容器 {}
        //2.开始加载
        properties.load(new FileReader("demo\\src\\com\\wosun\\File\\user.txt"));

        //3.判断是否包含张三这个键,存在则修改对应的值为”123456“
        if(properties.containsKey("张三")){
            properties.setProperty("张三","123456");
        }

        //4.把properties对象的键值对数据重新写到属性文件(user.txt)中去
        properties.store(new FileWriter("demo\\src\\com\\wosun\\File\\user.txt"),"success");
    }
}

1.3 XML文件

1.3.1 XML概述

XML(EXtensible Markup Language,可扩展标记语言)

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

XML的特点

        XML中的<标签名>称为一个标签或一个元素,一般是成对出现的

        XML中的标签名可以自己定义(可扩展),但必须要正确的嵌套

        XML中只能由一个根标签

        XML中的标签可以有属性

        如果一个文件中放置的是XML格式的数据,这个文件就是XML文件,后缀一般要写成.xml

XML的创建

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

XML的语法规则 

//user.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!-- 第一行是抬头声明,必须存在且放在第一行 -->

<!-- 根标签只能有一个-->
<users>
    <user id="1" desc="第一个用户">
        <name>张三</name>
        <sex>男</sex>
        <地址>快乐星球1</地址>
        <password>zs123456</password>
        <data> 3&lt;2 &amp;&amp; 5>4 </data>
        <data1>
            <![CDATA[
                3<2 && 5>4
            ]]>
        </data1>
    </user>
    <user id="2">
        <name>李四</name>
        <sex>男</sex>
        <地址>快乐星球2</地址>
        <password>ls654321</password>
    </user>
    <people> 很 多 人 </people>
</users>

XML的作用和应用场景

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

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

1.3.2 解析XML文件

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

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

DOM4J解析XML

//demo2
public class demo2 {
    public static void main(String[] args) throws Exception {
        //1.创建一个Dom4J框架提供的解析器对象
        SAXReader saxReader = new SAXReader();
        //2.使用saxReader对象把需要解析的XML文件都城一个Document对象
        Document document = saxReader.read("demo\\src\\com\\wosun\\File\\user.xml");
        //3.从文档对象中解析XML文件的全部数据
        //获取根元素
        Element root = document.getRootElement();
        System.out.println(root.getName()); //users

        //获取根元素下的全部一级子元素
        List<Element> elements = root.elements();
        for(Element element : elements){
            System.out.println(element.getName()); //user  user  people
        }

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

        //获取根元素下指定的子元素(二)
        Element people = root.element("people"); //只有一个该元素
        System.out.println(people.getText()); //很多人
        System.out.println(people.getTextTrim()); //去除文本去除前后空格
        Element user = root.element("user"); //有好几个该元素,默认获取第一个
        System.out.println(user.elementText("name")); //张三

        //获取元素的属性信息
        System.out.println(user.attributeValue("id")); //1
        Attribute id = user.attribute("id");
        System.out.println(id.getName()); //id
        System.out.println(id.getValue()); //1
        //获取元素的全部属性信息
        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("sex"));
        System.out.println(user.elementText("地址"));
        System.out.println(user.elementText("data"));
    }
}

1.3.3 把数据写入XML文件

//demo
public class demo {
    public static void main(String[] args) throws Exception {
        //使用一个StringBuilder对象拼接XML格式的数据
        StringBuilder sb = new StringBuilder();
        sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\r\n");
        sb.append("<users>\r\n");
        sb.append("\t<user>\r\n");
        sb.append("\t\t<name>").append("张三").append("</name>\r\n");
        sb.append("\t\t<pwd>").append("zs123").append("</pwd>\r\n");
        sb.append("\t</user>\r\n");
        sb.append("</users>\r\n");

        try(
                BufferedWriter bw = new BufferedWriter(new FileWriter("demo\\src\\com\\wosun\\File\\user.xml"));
                ){
            bw.write(sb.toString());
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

//结果
//user.xml

<?xml version="1.0" encoding="UTF-8" ?>
<users>
	<user>
		<name>张三</name>
		<pwd>zs123</pwd>
	</user>
</users>

1.3.4 约束XML文件的编写

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

约束文档

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

约束文档的分类

        DTD文档

        Schema文档

二. 日志技术

        把程序运行的信息,记录到文件中,方便程序员定位bug,并了解程序的执行情况等

日志技术

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

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

2.1 日志技术的体系结构

2.2 Logback

Logback日志框架官网:Logback Home

Logback日志框架的三个模块:

2.2.1 Logback快速入门

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

    public static void main(String[] args) {
        try{
            LOGGER.info("除法方法开始执行---");
            chu(10,0);
            LOGGER.info("除法方法执行成功---");
        }catch (Exception e){
            LOGGER.error("除法方法执行失败,出现bug---");
        }
    }

    public static void chu(int a, int b){
        LOGGER.debug("参数a:" + a);
        LOGGER.debug("参数b:" + b);
        int c = a / b;
        System.out.println("结果是:" + c);
        LOGGER.info("结果是:" + c);
    }
}

2.2.2 核心配置文件logback.xml

        注意:对Logback日志框架的控制,都是通过其核心配置文件logback.xml来实现的

//Logback.xml
<?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、控制日志的输出情况:如,开启日志,取消日志
    -->
    <root level="debug">
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="FILE" />
    </root>
</configuration>

2.2.3 Logback设置日志级别

  • 19
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值