配置文件
日志
1. Properties属性文件
1.1  特点、作用

 
- 都只能是键值对
- 键不能重复
- 文件后缀一般是.properties结尾的
1.2 读取

package cn.hdc.oop10.properties;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.Properties;
import java.util.Set;
public class t1 {
    public static void main(String[] args) throws Exception {
        //新建配置文件对象
        Properties properties = new Properties();
        System.out.println(properties);
        //读取数据
        properties.load(new FileReader("itDay01\\src\\Users.properties"));
        System.out.println(properties);
        //键取值
        System.out.println(properties.get("赵敏"));
        System.out.println(properties.get("张无忌"));
        //遍历全部的键和值
        Set<String> set = properties.stringPropertyNames();
        set.forEach(item -> {
            System.out.println(item + "=" + properties.get(item));
        });
        //Lambda
        properties.forEach((k, v) -> {
            System.out.println(k + "=" + v);
        });
    }
}
1.3 存储

package cn.hdc.oop10.properties;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Properties;
public class t2 {
    public static void main(String[] args) throws Exception {
        //新建配置文件对象
        Properties properties = new Properties();
        properties.setProperty("jsz", "1233");
        properties.setProperty("wsn", "1235");
        properties.setProperty("wzn", "1234");
        properties.store(new FileWriter("itDay01\\src\\Users2.properties"), "I saved many users");
    }
}
1.4 总结
Properties的作用?具体如何使用?
可以加载属性文件中的数据到Properties对象中来
void load(Reader reader)
public String getProperty(String key) 根据键获取值
可以存储Properties属性集的键值对数据到属性文件中去
void store(Writer writer, String comments)
public Object setProperty(String key, String value) 设置键值
2. XML属性文件
1.1 特点、作用
1.1.1 XML及特点

1.1.2 语法规则
<?xml version="1.0" encoding="utf-8" ?>
<Users>
    <user id="1">
        <name>赵无极</name>
        <grade><80</grade>
    </user>
    <user id="2">
        <name>玄子</name>
        <grade><![CDATA[海神阁阁主99]]></grade>
    </user>
    <user id="3">
        <name>王秋儿</name>
        <grade>>100</grade>
    </user>
</Users>XML的组成格式要求是什么样的?
文件后缀一般是是xml,文档声明必须是第一行
必须存在一个根标签,有且只能有一个
XML文件中可以定义注释信息:<!–- 注释内容 -->
标签必须成对出现,有开始,有结束标签: <name></name>
必须能够正确的嵌套
1.1.3 XML作用及应用

1.2 读取


1.2.1 Dom4j

1.2.2 Document
 1.2.3  Element
 1.2.3  Element
 

package cn.hdc.oop10.xml;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.util.List;
public class t2 {
    public static void main(String[] args) throws Exception {
        SAXReader reader = new SAXReader();
        Document doc = reader.read("itDay01\\b-2.xml");
        Element ele = doc.getRootElement();
        //ele方法
        //得到根节点元素名字
        String rootName = ele.getName();
        System.out.println(rootName);
        //得到当前元素下所有子元素
        List<Element> allElements = ele.elements();//得到user集合
        for (Element element : allElements) {
            System.out.println(element.getName());
            //通过属性名得到属性值
            String id = element.attributeValue("id");
            System.out.println(id);
            //得到当前元素下指定名字的子元素,如果有很多名字相同的返回第一个
            String name = element.element("name").getText();
            System.out.println(name);
//            List<Element> userList = element.elements();
//            for (Element user : userList) {
//                System.out.println(user);//user里面的每一个元素的集合
//            }
        }
    }
}
1.2.4 案例

b_2.xml
<?xml version="1.0" encoding="UTF-8" ?>
<users>
    <user id="1">
        <name>张无忌</name>
        <password>minmin</password>
        <address>光明顶</address>
        <gender>男</gender>
    </user>
    <user id="2">
        <name>敏敏</name>
        <password>wuji</password>
        <address>光明顶</address>
        <gender>女</gender>
    </user>
</users>
Java
package cn.hdc.oop10.xml;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.util.ArrayList;
import java.util.List;
public class t1 {
    public static void main(String[] args) throws Exception {
        ArrayList<User> userList = new ArrayList<>();
        SAXReader reader = new SAXReader();
        Document doc = reader.read("itDay01\\b-2.xml");
        Element ele = doc.getRootElement();
        //获取根标签下的所有子标签
        List<Element> list = ele.elements();
        //遍历根标签的集合
        for (Element element : list) {
            String name = element.element("name").getText();
            String password = element.element("password").getText();
            String address = element.element("address").getText();
            String gender = element.element("gender").getText();
            User user = new User(name, password, address, gender);
            userList.add(user);
        }
        System.out.println(userList);
    }
}
class User {
    private String name;
    private String password;
    private String address;
    private String gender;
    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", password='" + password + '\'' +
                ", address='" + address + '\'' +
                ", gender='" + gender + '\'' +
                '}';
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    public String getGender() {
        return gender;
    }
    public void setGender(String gender) {
        this.gender = gender;
    }
    public User() {
    }
    public User(String name, String password, String address, String gender) {
        this.name = name;
        this.password = password;
        this.address = address;
        this.gender = gender;
    }
}
1.3 约束(了解)
1.3.1 DTD文档

1.3.2 Schema文档

3. 日志
3.1 概念
3.1.1 日志技术

3.1.2 日志技术的体系结构
 3.2  快速入门
3.2  快速入门
 
3.2.1 基本使用

package cn.hdc.oop10.log;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class t1 {
    public static final Logger LOGGER = LoggerFactory.getLogger(t1.class);
    public static void main(String[] args) {
//        LOGGER.info();
//        LOGGER.debug();
//        LOGGER.warn();
//        LOGGER.error();
        LOGGER.info("开始执行div方法了...");
        div(1, 2);
        div(1, 0);
    }
    public static int div(int a, int b) {
        try {
            LOGGER.debug("方法执行了a={},b={}", a, b);
            return a / b;
        } catch (Exception e) {
            LOGGER.error("{}除{}出错了", a, b);
            e.printStackTrace();
            throw new RuntimeException();
        }
    }
}
3.2.2 日志级别

3.2.3 配置文件

<?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>F:/log/itheima-data.log</file>
        <!--指定日志文件拆分和压缩规则-->
        <rollingPolicy
                class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!--通过指定压缩文件名称,来确定分割文件方式-->
            <fileNamePattern>F:/log/itheima-data-%i-%d{yyyy-MM-dd}-.log.gz</fileNamePattern>
            <!--文件拆分大小-->
            <maxFileSize>1MB</maxFileSize>
        </rollingPolicy>
    </appender>
    <!--
        1、控制日志的输出情况:如,开启日志,取消日志
    -->
    <root level="ALL">
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="FILE" />
    </root>
</configuration>




















