对于两类特殊文件和日志技术的初步学习理解
目录
1.特殊文件
作用:存储有关系的数据,作为系统的配置文件,作为信息进行传输
(1)Properties属性文件
属性文件,是一个Map集合,内容都是一些键值对信息,每行都是一个键值对
一般以.properties结尾,通过Properties可以读写属性文件里的内容。(其实无所谓文件后缀是什么,属性文件关注文件内容是键值对)
构造器 | 说明 |
public Properties() | 用于构建Properties集合对象(空容器) |
常用方法 | 说明 |
public void load(InputStream is) | 通过字节输入流,读取属性文件里的键值对数据 |
public void load(Reader reader) | 通过字符输入流,读取属性文件里的键值对数据 |
public String getProperty(String key) | 根据键获取值(实际就是get方法) |
public Set<String> stringPropertyNames() | 获取全部键的集合(实际就是KeySet方法) |
package IO_Study;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.util.HashSet;
import java.util.Properties;
import java.util.Set;
public class Text15 {
public static void main(String[] args) throws IOException {
//1.创建一个Properties集合
Properties pro = new Properties();
System.out.println(pro); //集合初始化为空
//2.开始加载属性文件的键值对数据到Properties对象中
Reader reader = new FileReader("C:\\Users\\22935\\IdeaProjects\\JAVA_study\\Collection\\src\\IO_Study\\data_text.properties");
pro.load(reader);
System.out.println(pro);
System.out.println(pro.getProperty("admin")); //根据键取值
Set<String> keys = pro.stringPropertyNames();
for (String key : keys) {
String value = pro.getProperty(key);
System.out.println(key + "----->" + value);
}
}
}
常用方法 | 说明 |
public Object setProperty(String key,String value) | 保存键值对数据到properrties对象中去 |
public void store(OutputStream os,String comments) | 把键值对数据,通过字节输出流写到属性文件里去 |
public void store(Wrriter w,String comments) | 把键值对数据,通过字符输出流写到属性文件里去 |
package IO_Study;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Properties;
public class Text16 {
public static void main(String[] args) throws IOException {
Properties pro = new Properties();
pro.setProperty("楠楠","050501");
//存入键值对
pro.store(new FileWriter("C:\\Users\\22935\\IdeaProjects\\JAVA_study\\Collection\\src\\IO_Study\\data_text.properties"),"users");
}
}
(2)XML文件
可扩展标记语言,本质是一种的格式,可以用来存储复杂的数据结构,和数据关系
XML的特点:
- XML的<标签名> 称为一个标或一个元素,一般成对出现
- 标签名可以自己定义(可拓展),但必须正确嵌套
- XML中只能有一个根标签
- XML中的标签可以有属性
- 文件放置的是XML格式的数据,这个文件就是XML文件,后缀一般要写成.xml
<?xml version = "1.0" encoding = "UTF-8"?>
<!-- 注释:抬头声明必须放在第一行,必须有-->
<!-- version 默认版本号码 encoding 文件的编码-->
<!-- 根标签只能有一个-->
<users>
<ueser is = "1">
<name>陈平安</name>
<sex>男</sex>
<地址>落魄山</地址>
<!--书写中“<”和“&”可能会出现冲突报错 ,需要特殊字符替代-->
<password>pinpinanan</password>
</ueser>
<ueser is = "2">
<name>宁姚</name>
<sex>女</sex>
<地址>五彩天下</地址>
<password>tianzhen</password>
</ueser>
</users>
XML书写中“<”和“&”可能会出现冲突报错 ,需要特殊字符替代
< < 小于 > > 大于 & & 和号 &apos ’ 单引号 " “ 引号 有一个CDATA的数据区:<![CDATA[...内容...]]>,里面的内容随意
应用场景:经常作为系统的配置文件,或者作为一种特殊的数据结构,在网络中进行传输
读取数据:
开源解析XML的框架,最知名的是:Dom4j
SAXReader:Dom4j的解析器
构造器 | 说明 |
public SAXReader() | 构建Dom4j的解析器 |
public Document read(String url) | 把XML文件读成DOcument对象 |
public Document read(InputStream is) | 通过字节输入流读取XML文件 |
Doument
方法 | 说明 |
Element getRootElement() | 获取根元素对象 |
Element
方法名 | 说明 |
public String getName() | 得到元素名称 |
public List<Element> elements() | 得到当前元素下的所有子元素 |
public List<Element> elements(String name) | 得到当前元素下指定名字的子元素返回集合 |
public Element elements(String name) | 得到当前元素下指定名字的元素,如果有重名则返回第一个 |
public String attributteValue(String name) | 通过属性名直接得到属性值 |
public String elementText(子元素名) | 得到指定名称的子元素的文本 |
public String getText() | 得到文本 |
数据写入XML文件中
不建议用Dom4j做,建议把数据拼接成XMl格式,用IO流写出去,使用DTD文档进行约束
2.日志技术
把程序运行的信息,记录到指定位置(控制台,文件,数据库)中,方便定位BUG,并了解程序的执行情况
可以随时以开关的形式控制日志的启停,无需侵入源代码中去进行修改
这里学习SLF4J日志接口下的logback日志框架
模块
lodback-core 01 基础模块 lodback-classic 02 完整实现slf4j API的模块 lodback-access 03 提供访问HTTP访问日志的功能
使用
- 导入Logback框架到项目中,三个模块
- 将Logback框架的核心配置文件logback.xml直接拷贝到src目录下
- 创建Logback框架提供的Logger对象,然后使用Logger对象调用其提供的方法就可以记录系统的日志信息
package IO_Study;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class TextLogger {
public static final Logger LOGGER = LoggerFactory.getLogger("users");
public static void main(String[] args) {
try {
LOGGER.info("chu方法开始运行");
System.out.println(chu(10.0, 2.0));
} catch (Exception e) {
LOGGER.error("执行失败");
throw new RuntimeException(e);
}
}
public static double chu(double a, double b){
LOGGER.debug("参数a"+a);
LOGGER.debug("参数b"+b);
double c = a/b;
LOGGER.info("结果为"+c);
return c;
//目标位置的log文件中可以叠加
}
}
核心配置文件
对Logback日志框架进行控制的
可以对于输出位置会和输出格式进行设置
还可以开启日志和取消日志
<?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>C:/code/siyee-data.log</file>
<!--指定日志文件拆分和压缩规则-->
<rollingPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--通过指定压缩文件名称,来确定分割文件方式-->
<fileNamePattern>C:/code/siyee-data2-%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="ALL">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE" />
</root>
</configuration>
日志级别
日志级别大于或者等于核心配置文件的日志级别才会被记录
日志级别 说明 trace 追踪,指明程序运行轨迹 debug 调试,实际应用中为最低级别,而trace中很少使用 info 输出重要的运行信息,数据连接,网络连接,IO操作等,使用较多 warn 警告信息,可能会发生问题 error 错误信息,使用较多
学习时间:2024-8-28