一. 特殊文件
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<2 && 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>