特殊文本文件、日志技术

特殊文件 

为什么要用这些特殊文件? 存储多个用户的:用户名、密码

特殊文件:Properties属性文件

特点:

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

作用:存储一些有关系的键值对数据

 Properties

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

admin=123456
张无忌=minmin
周芷若=wuji
赵敏=wuji


import java.io.FileNotFoundException;
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("D:\\code\\idea-javacode\\javaseproject\\properties-xml-log-app\\src\\users.properties"));
        //异常直接抛出去
        System.out.println(properties);
        //3.根据键取值
        System.out.println(properties.getProperty("赵敏"));
        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);
        }*/
        //Lambda表达式 ???
        properties.forEach((k,v) ->{
            System.out.println(k + "---->" + v);
        });


    }
}



import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
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("D:\\code\\idea-javacode\\javaseproject\\properties-xml-log-app\\src\\user2.properties")
        ,"i saved many users!");//这个管道不用自己关闭,这个管道是作为一个参数给store方法,他内部用完这个管道之后他会帮你关,所有不用管*/


        //1.加载属性文件的键值对到程序中来
        Properties properties = new Properties();
        //2.开始加载
        properties.load(new FileReader("D:\\code\\idea-javacode\\javaseproject\\properties-xml-log-app\\src\\user2.properties"));
        //此时已经把键值对数据给到集合里边来了
        //3.判断是否包含张翠山这个键 有则修改他的值为18就行了(毕竟是个map集合)
        if(properties.containsKey("张翠山")){//map集合看有没有包含这个键
            properties.setProperty("张翠山","18");//来改这个数据
        }//这里改了但是不会存进文件中,只是将properties容器中的内容改好了
        //4.把properties对象的键值对(里面的内容)写出去到属性文件中去
        properties.store(new FileWriter("D:\\code\\idea-javacode\\javaseproject\\properties-xml-log-app\\src\\user2.properties")
                ,"success");
        //store是写入,然后new一个FileWriter通向的还是这个路径,后面要有注释
    }
}
#success
#Fri Mar 15 19:55:13 CST 2024
张无忌=minmin
张翠山=18
殷素素=cuishan


特殊文件:XML文件

概述

XML(全称EXtensibleMarkup Language,可扩展标记语言)

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

XML的特点

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

XML的创建

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

<?xml version="1.0" encoding="UTF-8" ?>
<!--注释:以上抬头声明必须有,必须放在第一行 -->
<!-- 根标签只能有一个 -->
<users>
    <user id="1">
        <name>张三</name>
        <sex>男</sex>
        <age>21</age>
        <地址>北京</地址>
        <password>666888wyf</password>
        <data> 3 &lt; 2 &amp;&amp; 5 > 4 </data>
        <!--  CD 特殊数据区 : 可以写任意内容-->
        <data>
            <![CDATA[
                3 < 2 && 5 > 4
            ]]>
        </data>
    </user>
    <user id="2">
        <name>李四</name>
        <sex>男</sex>
        <age>24</age>
        <地址>广州</地址>
        <password>lzxfff666</password>
    </user>
</users>

XML的作用和应用场景

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

注意:程序员并不需要自己写原始的IO流代码来解析XML,难度较大!也相当繁琐!
其实,有很多开源的,好用的,解析XML的框架,最知名的是:Dom4j(第三方研发的) 

步骤:使用Dom4j解析出XML文件
需求:使用Dom4]把一个XML文件的数据进行解析
分析:

  1. 下载Dom4i框架,官网下载。
  2. 在项目中创建一个文件夹:lib
  3. 将dom4j-2.1.3.jar文件复制到 lib 文件夹
  4. 在jar文件上点右键,选择 Add as Library ->点击OK
  5. 在类中导包使用

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

dom4j解析xml文件是一种自上而下的解析思想。(必须先拿到文档对象,再通过文档对象拿到根元素对象,之后才可以根据根元素对象拿到子元素对象,再通过子元素对象拿到他下面的子元素对象,从父到子,一级一级的解析)



import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
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();//这个对象也是代表整个Dom4j框架的

        //2.使用saxReader对象把需要解析的XML文件读成一个Document对象。
        //saxReader.read("D:\\code\\idea-javacode\\javaseproject\\properties-xml-log-app\\src\\helloworld.xml");
        //此时只是把xml文件读成一个文档对象
        //然后把他交给一个文档类型的变量document来记住
        Document document =
                saxReader.read("D:\\code\\idea-javacode\\javaseproject\\properties-xml-log-app\\src\\helloworld.xml");
        //这时这个文档对象就会代表整个XML文件的
        //3.从文档对象中解析XML文件的全部数据
        Element root = document.getRootElement();
        //获得根元素对象也就是<users>这个根元素对象 --> 把他交给一个Element类型的变量root(根元素对象)指代的就是<users>这个根元素
        //System.out.println(root.getName());

        //4.获取根元素下的全部一级子元素
        //List<Element> elements = root.elements();//把一级子元素放到一个集合中给我们 -> 遍历集合中的一级子元素对象 elements.for
        List<Element> elements = root.elements("user");//声明一个名字专门拿某些子元素
        for (Element element : elements) {
            System.out.println(element.getName());//通过子元素拿到名字   //user user
        }

        //5.获取当前元素下的某个子元素(1.可以拿到所有的一级子元素通过索引去拿 2.指定:调用element方法来定位单个子元素)
        Element people = root.element("people");
        System.out.println(people.getText());      //很多人
        //如果下面有很多子元素user,默认拿第一个
        Element user = root.element("user");
        System.out.println(user.elementText("name"));//elementText()是会去拿下面子元素name的文本内容     //张三

        //6.如何去获取元素的属性信息呢?
        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());//id=1  \r\n   desc=第一个用户
        }

        //7.如何获取全部的文本内容:获取当前元素下的子元素文本值
        //通过user子元素调用elementText()取他下面的子元素的文本
        System.out.println(user.elementText("name"));  //张三
        System.out.println(user.elementText("地址"));     //北京
        System.out.println(user.elementText("password"));  //666888wyf

        //!!!!!!!!根据根元素子元素在拿到下面的子元素对象,再通过子元素对象直接getText获取他的文本
        Element data =user.element("data");
        System.out.println(data.getText());   // 3 < 2 && 5 > 4
        System.out.println(data.getTextTrim());// 取出文本去除前后空格   //3 < 2 && 5 > 4



    }
}

如何使用程序把数据写出到XML文件中去?不建议用dom4j做,很复杂。

推荐直接把程序里的数据拼接成XML格式,然后用IO流写出去!(这样的需求比较少,了解)


import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.Buffer;

/**
 * 目标:如何使用程序把数据写出到XML文件中去
 * <?xml version="1.0"encoding="UTF-8"?>
 * <book>
 *     <name>从入门到跑路</name>
 *     <author>yf</author>
 *     <price>999.99</price>
 * </book>
 */

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

        ///拼接好后接下来把他写出到xml文件中去
        //用一个缓冲字符输出流......
        try (
                BufferedWriter bw =
                        new BufferedWriter(new FileWriter("D:\\code\\idea-javacode\\javaseproject\\properties-xml-log-app\\src\\users.properties"));
                ){
            bw.write(sb.toString());//把StringBuilder打成字符串

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

补充知识:约束XML文件的编写[了解]
  • 就是限制XML文件只能按照某种格式进行书写

约束文档

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

约束文档的分类

  • DTD文档
  • Schema文档

日志技术 

概述

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

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

日志技术

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

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

Logback快速入门(!!!)

需求

  • 使用Logback日志框架,纪录系统的运行信息。

实现步骤

  1. 导入Logback框架到项目中去。
  2. 将Logback框架的核心配置文件logback.xml直接拷贝到src目录下(必须是src下)。
  3. 创建Logback框架提供的Logger对象,然后用Logger对象调用其提供的方法就可以记录系统的日志信息。

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

日志的输出位置、输出格式的设置

  • 通常可以设置2个输出日志的位置:一个是控制台、一个是系统文件中
<appender name="CONSOLE" class="ch.gos.logback.core.ConsoleAppender">
<appender name="FILE" class="ch.gos.logback.core.rolling.RollingfileAppender">

开启日志(ALL),取消日志(OFF)

<root level="ALL">
    <appender-ref ref="CONSOLE"/>
    <appender-ref ref="FILE" />
</root>

 指定日志文件的拆分和压缩规则(重点):系统日志都流向这个文件,一直积累会非常大;所以在开发中,为了避免日志文件过大,在logback日志文件中配置“日志文件的拆分和压缩规则”。

(一旦这个日志文件到1MB,就会把他压缩成一个日志文件,然后又重新的记录日志,如果又到达1MB,又把这个日志文件压缩成一个新的日志文件中存储,重复!这样就会保证每个日志文件不会超过1MB)

Logback设置日志级别(特别重要!!!)

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

合理的输出日志级别,方便我们更好的查询日志信息。开发中为了程序员方便定位问题,不想系统记录全部的日志级别信息,如果只想记录info、warn、error日志:就必须需要用到设置日志级别的技术来控制了。

<root level=info">
    <appender-ref ref="CONSOLE"/>
    <appender-ref ref="FILE" />
</root>
  • 只有日志的级别是大于或等于核心配置文件配置的日志级别,才会被记录,否则不记录。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/463477.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基础-笔试题2

1、int a[10]{1,2,3,4,5,6,7,8,9,0}; int *p&a[1]; 则p[6]等于_ 答&#xff1a;8 &#xff0c;考察数组和指针的基本用法&#xff1b; 2、整数数组清零的方法&#xff1f; bzero(),memset()。 memset() 是C语言标准库中的一部分&#xff0c;用于将内存区域设置…

leetcode刷题日记之串联所有单词

题目描述 解题思路 一开始考虑的就是暴力破解&#xff0c;每次切片切words中字母的个数&#xff0c;然后根据每个词语的长度进行进一步的切片&#xff0c;将切出来的单词放入列表&#xff0c;然后每次对比一次&#xff0c;如果存在&#xff0c;就从原来的列表中&#xff0c;删…

LeetCode Python - 58. 最后一个单词的长度

目录 题目描述解法运行结果 题目描述 给你一个字符串 s&#xff0c;由若干单词组成&#xff0c;单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。 单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。 示例 1&#xff1a; 输入&#xff1a;s “Hel…

Leet code 34 在排序数组中查找元素的第一个和最后一个位置

解题思路 二分查找 核心就是 先找到左端点的位置 再找到右端点的位置 二分查找整体不难 但难在细节处理 一旦处理不好就是死循环 定义rightnums.size()-1 left0 if(nums[mid] < target) 更新 left leftmid1 if(nums[mid] > target) 这里为什么要大于等于我们不…

idea error java:compilation failed:internal java compiler error

idea中编译运行maven项目报错如下 idea error java:compilation failed:internal java compiler error 尝试如下操作 注意&#xff1a;jdk8 需要设置4个地方 1.首先打开File->Project Structure中的Project&#xff0c;将SDK和language level都设置一致&#xff0c;如下…

【LeetCode热题100】148. 排序链表(链表)

一.题目要求 给你链表的头结点 head &#xff0c;请将其按 升序 排列并返回 排序后的链表 。 二.题目难度 中等 三.输入样例 示例 1&#xff1a; 输入&#xff1a;head [4,2,1,3] 输出&#xff1a;[1,2,3,4] 示例 2&#xff1a; 输入&#xff1a;head [-1,5,3,4,0] 输…

日期与时间(Java)

文章目录 日期与时间&#xff08;Java&#xff09;一、JDK8之前的1.1 Date1.2 SimpleDateFormat1.3 Calendar 二、 JDK8之后的2.1 LocalDate、LocalTime和LocalDateTime2.2 ZoneId和ZonedDateTime2.3 Instant2.4 DateTimeFormatter2.4 Period和 Duration &#x1f389;写在最后…

数据结构:详解【链表】的实现(单向链表+双向链表)

目录 一&#xff0c;前言二 &#xff0c;有关链表的概念&#xff0c;结构和分类三&#xff0c;无头单向非循环链表&#xff08;单链表&#xff09;1.单链表的功能2.单链表功能的实现3.完整代码 四&#xff0c;带头双向循环链表&#xff08;双链表&#xff09;1.单链表与双链表的…

YOLOv9改进策略:注意力机制 | 归一化的注意力模块(NAM)

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文改进内容&#xff1a; NAM作为一种高效且轻量级的注意力机制。采用了CBAM的模块集成并重新设计了通道和空间注意子模块。 yolov9-c-NAMAttention summary: 965 layers, 51000614 parameters, 51000582 gradients, 238.9 GFLOPs 改…

Java基础 - 9 - 集合进阶(二)

一. Collection的其他相关知识 1.1 可变参数 可变参数就是一种特殊形参&#xff0c;定义在方法、构造器的形参列表里&#xff0c;格式是&#xff1a;数据类型…参数名称; 可变参数的特点和好处 特点&#xff1a;可以不传数据给它&#xff1b;可以传一个或者同时传多个数据给…

html中如何让网页禁用右键禁止查看源代码

在网页中&#xff0c;辛辛苦苦写的文章&#xff0c;被别人复制粘贴给盗用去另很多站长感到非常无奈&#xff0c;通常大家复制都会使用选取右键复制&#xff0c;或CTRLC等方式&#xff0c;下面介绍几种禁止鼠标右键代码&#xff0c;可减少网页上文章被抄袭的几率&#xff0c;当然…

Day38:安全开发-JavaEE应用SpringBoot框架MyBatis注入Thymeleaf模版注入

目录 SpringBoot-Web应用-路由响应 SpringBoot-数据库应用-Mybatis SpringBoot-模版引擎-Thymeleaf 思维导图 Java知识点 功能&#xff1a;数据库操作&#xff0c;文件操作&#xff0c;序列化数据&#xff0c;身份验证&#xff0c;框架开发&#xff0c;第三方库使用等. 框架…

PyTorch学习笔记之激活函数篇(二)

文章目录 2、Tanh函数2.1 公式2.2 对应的图像2.3 对应生成图像代码2.4 优点与不足2.5 torch.tanh()函数 2、Tanh函数 2.1 公式 Tanh函数的公式&#xff1a; f ( x ) e x − e − x e x e − x f(x)\frac{e^x-e^{-x}}{e^xe^{-x}} f(x)exe−xex−e−x​ Tanh函数的导函数&am…

idea找不到或无法加载主类

前言 今天在运行项目的时候突然出了这样一个错误&#xff1a;IDEA 错误 找不到或无法加载主类,相信只要是用过IDEA的朋友都 遇到过它吧&#xff0c;但是每次遇到都是一顿焦头烂额、抓耳挠腮、急赤白咧&#xff01;咋整呢&#xff1f;听我给你吹~ 瞧我这张嘴~ 问题报错 找不…

C++之类(持续更新)

1、类的基础知识点 1.1、类和对象 和C中的结构体不同&#xff0c;在C类中不仅可以定义变量&#xff0c;也可以定义函数。【在C结构体中也可以定义变量和函数&#xff0c;但是一般情况下都使用类】。 类的成员属性默认都是private&#xff1b;结构体的成员属性默认都是public。…

利用express从0到1搭建后端服务

目录 步骤一&#xff1a;安装开发工具步骤二&#xff1a;安装插件步骤三&#xff1a;安装nodejs步骤四&#xff1a;搭建启动入口文件步骤五&#xff1a;启动服务器总结 在日常工作中&#xff0c;有很多重复和繁琐的事务是可以利用软件进行提效的。但每个行业又有自己的特点&…

特殊文件——属性文件、XML文件

目录 特殊文件 ——属性文件、XML文件 特殊文件的作用 需要掌握的知识点 Properties文件 ​编辑 构造器与方法​编辑 使用Properties 把键值对数据写出到属性文件中 ​编辑 XML文件​编辑 XML文件的作用和应用场景 解析XML文件 使用Dom4J框架解析出XML文件——下载…

EXCEL+PYTHON学习3

1&#xff09; 遍历一个SHEET&#xff0c;无非就是两个循环&#xff0c;rows属性是取得所有行。 fn data3_16.xlsx wb openpyxl.load_workbook(fn) ws wb.active for row in ws.rows:for cell in row:print(cell.value, end )print() 2&#xff09; 返回工作表的最小行数…

TCP/IP协议栈

TCP/IP协议栈&#xff08;Transmission Control Protocol/Internet Protocol Suite&#xff09;是互联网上进行数据通信的一系列网络协议的集合&#xff0c;它是现代计算机网络通信的基础架构。 它由多个不同的协议层构成&#xff0c;每层负责不同层面的数据处理和传输工作&…

PyQt5使用

安装Pyqt5信号与槽使用可视化界面编辑UI (Pyside2)ui生成之后的使用(两种方法)1 ui转化为py文件 进行import2 动态调用UI文件 安装Pyqt5 pip install pyqt5-tools这时候我们使用纯代码实现一个简单的界面 from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButto…