找回密码
 立即注册
首页 业界区 业界 26Java基础之特殊文本文件、日志技术

26Java基础之特殊文本文件、日志技术

准挝 4 天前
特殊文件

为什么要用这些特殊文件?

  • 存储多个用户的:用户名、密码
Rroperties

1.png


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

案例
  1. users.properties内容如下:
  2. admin=123456
  3. 赵敏=wuji
  4. 张无忌=zhaomin
  5. 灰太狼=xiyangyang
  6. 测试文件:
  7. //目标:Properties读取属性文件中的键值对数据
  8. public class PropertiesDemo01 {
  9.     public static void main(String[] args) throws Exception {
  10.         //1.创建属性集对象,代表一个属性文件
  11.         Properties prop = new Properties();
  12.         //2. 加载属性文件信息到属性集对象中去
  13.         prop.load(new FileReader("day11-special-file-log-code\\src\\com\\javabase\\d1_properties\\users.properties"));
  14.         System.out.println(prop);
  15.         //根据键取值
  16.         System.out.println(prop.getProperty("admin"));
  17.         Set<String> keys = prop.stringPropertyNames();
  18.         for (String key : keys) {
  19.             String value = prop.getProperty(key);
  20.             System.out.println(key + "=" + value);
  21.         }
  22.         
  23.         //3.遍历数据
  24.         prop.forEach((k,v)-> System.out.println(k + "====>" + v));
  25.     }
  26. }
复制代码
使用Properties把键值对数据写出到属性文件里去
3.png

案例
  1. //目标:Properties写入属性文件中的键值对数据
  2. public class PropertiesDemo02 {
  3.     public static void main(String[] args) throws Exception {
  4.         //1. 创建属性集对象
  5.         Properties prop = new Properties();
  6.         prop.setProperty("玄冥二老", "wangfei");
  7.         prop.setProperty("tom", "jay");
  8.         prop.setProperty("金毛狮王", "成昆");
  9.         System.out.println(prop);
  10.         //2. 存储文件
  11.         prop.store(new FileWriter("day11-special-file-log-code\\src\\com\\javabase\\d1_properties\\users1.properties"),"lots of users");
  12.     }
  13. }
复制代码
案例:把文件中某个键值对中的值修改,改完后重新写回文件
  1. people.txt文件内容如下:
  2. 张三=45
  3. 张全蛋=24
  4. 李二狗=24
  5. 李四=23
  6. 李芳=35
  7. 王麻子=13
  8. 测试文件:
  9. public class PropertiesTest {
  10.     public static void main(String[] args) throws Exception {
  11.         //1.创建Properties对象
  12.         Properties prop = new Properties();
  13.         //2.加载文件
  14.         prop.load(new FileReader("day11-special-file-log-code\\src\\com\\javabase\\d1_properties\\people.txt"));
  15.         //3.判断是否存在“李芳”
  16.         if(prop.containsKey("李芳")){
  17.             prop.setProperty("李芳", Integer.toString(18));
  18.         }
  19.         //4. 把属性文件对象,重新存入到属性文件中去
  20.         prop.store(new FileWriter("day11-special-file-log-code\\src\\com\\javabase\\d1_properties\\people.txt"), "");
  21.     }
  22. }
复制代码
XML(全称EXtensible Markup Language,可拓展标记语言)


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

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

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

XML语法规则
<ul>XML文件的后缀名为:xml,文档声明必须是第一行。
5.png
XML中可以定义注释信息:
<strong>XML中书写"\r\n");        sb.append("\r\n");        sb.append("").append("张无忌").append("\r\n");        sb.append("").append("男").append("\r\n");        sb.append("").append("wuji@itcast.cn").append("\r\n");        sb.append("\r\n");        PrintStream out = new PrintStream("day11-special-file-log-code\\src\\Contacts1.xml");        out.println(sb);                out.close();    }}[/code]约束XML文件的书写

  • 就是限制XML文件只能按照某种格式进行书写。
约束文档

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

  • DTD文档
  • Schema文档
案例

  • XML文档约束-DTD的使用(了解)
    需求:利用DTD约束文档,约束一个XML文件的编写。

    • 编写DTD约束文档,后缀必须是.dtd
      6.png

    • 在需要编写的XML文件中导入该DTD约束文档
    • 然后XML文件,就必须按照DTD约束文档指定的格式进行编写,否则报错。

注意:DTD可以约束XML文件的编写,不能约束具体的数据类型。

  • XML文档约束-schema的使用(了解)
    需求:利用schema文档约束,约束一个xml文件的编写。
    7.png

    • 编写schema约束文档,后缀必须是.xsd,具体的形式到代码中查看。
    • 在需要编写的xml文档中导入该schema约束文档。
    • 按照约束内容编写xml文件的标签

日志技术

什么是日志?

  • 希望系统能记住某些数据是被谁操作的,比如被删除了。
  • 想分析用户浏览系统的具体情况,以便挖掘用户的具体喜好。
  • 当系统在开发中或者上线后出现了bug,崩溃了,该通过什么去分析、定位问题。
目前记录日志的方法
8.png

输出语句的弊端

  • 日志会展示在控制台
  • 不能更方便的将日志记录到其他的位置(文件,数据库)
  • 想取消日志,需要修改源代码才可以完成
日志技术

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


  • 日志框架:牛人或者第三方公司已经做好的实现代码,后来者直接可以拿来使用。
  • 日志接口:设计日志框架的一套标准,日志框架需要实现这些接口。
    10.png

    注意:

    • 因为对Commons Logging接口不满意,有人就搞了SLF4J。因为对log4j的性能不满意,有人就搞了logback。
    • Logback是基于slf4j的日志规范实现的框架。

Logback日志框架官方网站:https://repo1.maven.org/maven2/ch/qos/logback/
slf4j-api日志框架下载地址:https://repo1.maven.org/maven2/org/slf4j/slf4j-api/
Logback日志框架有以下几个模块:
11.png

想使用logback日志框架,至少需要在项目中整合如下三个模块:
12.png


Logback快速入门
需求:使用logback日志框架,记录系统运行信息。
实现步骤

  • 导入logback框架到项目中去。


  • slf4j-api:日志接口
  • logback-core
  • logback-classic

  • 将Logback框架的核心配置文件Logback.xml直接拷贝到src目录下(必须是src下)。
  • 创建Logback框架提供的logger对象,然后用logger对象调用其提供的方法就可以记录系统的日志信息。
  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <users>
  3.     <user>
  4.         <name>张全蛋</name>
  5.         32</age>
  6.         <gender>男</gender>
  7.         <hobby>炸机</hobby>
  8.         <sql>
  9.                 select * from tb_student where age >=18 && age <= 35
  10.         </sql>
  11.     </user>
  12.     <user>
  13.         <name>何广智</name>
  14.         28</age>
  15.         <gender>男</gender>
  16.         <hobby>脱口秀</hobby>
  17.         <![CDATA[
  18.             select * from tb_student where age >=18 && age <= 35
  19.         ]]>
  20.     </user>
  21. </users>
复制代码
案例代码
  1. // 目标:解析XML文件,使用Dom4j框架
  2. public class Dom4jTest01 {
  3.     public static void main(String[] args) throws Exception {
  4.         //1. 创建SAXReader解析器对象
  5.         SAXReader saxReader = new SAXReader();
  6.         //2. 把xml文件读成一个Document文档对象。
  7.         Document doc = saxReader.read("day11-special-file-log-code\\src\\Contact.xml");
  8.         // 3. 文档对象中包含了XML的全部数据,提供了方法获取数据
  9.         Element rootElement = doc.getRootElement();
  10.         System.out.println(rootElement.getName());
  11.         //4. 提取子元素对象
  12. //        List<Element> soneles = rootElement.elements();
  13.         List<Element> soneles = rootElement.elements("contact");
  14.         for (Element sonele : soneles) {
  15.             System.out.println(sonele.getName());
  16.         }
  17.         // 指定获取单个子元素对象
  18.         Element userEle = rootElement.element("user");
  19.         System.out.println(userEle.elementText("name"));
  20.         Element contactEle = rootElement.element("contact");//默认取第一个contact
  21.         System.out.println(contactEle.elementText("name"));
  22.         // 5. 提取子元素的属性对象
  23.         Attribute idAttr = contactEle.attribute("id");
  24.         System.out.println(idAttr.getName());
  25.         System.out.println(idAttr.getValue());
  26.         //直接拿属性值
  27.         System.out.println(contactEle.attributeValue("id"));
  28.         //6. 文本值
  29.         // 通过父元素拿到子元素文本值
  30.         System.out.println(contactEle.elementText("name"));
  31.         System.out.println(contactEle.elementTextTrim("name"));//去除内容两边的空
  32.     }
  33. }
  34. 输出结果:
  35. contactList
  36. contact
  37. contact
  38. contact
  39. 武大郎
  40. 潘金莲
  41. id
  42. 1
  43. 1
  44. 潘金莲
  45. 潘金莲
复制代码
logback.xml文件内容如下
  1. Contacts.xml文件
  2. <?xml version="1.0" encoding="UTF-8"?>
  3. <contactList>
  4.     <contact id="1" vip="true">
  5.         <name>张无忌</name>
  6.         <gender>男</gender>
  7.         <email>wuji@itcast.cn</email>
  8.     </contact>
  9.     <contact id="2" vip="false">
  10.         <name>小昭</name>
  11.         <gender>女</gender>
  12.         <email>xiaozhao@itcast.cn</email>
  13.     </contact>
  14.     <contact id="3" vip="false">
  15.         <name>灭绝师太</name>
  16.         <gender>女</gender>
  17.         <email>miejue@itcast.cn</email>
  18.     </contact>
  19. </contactList>
  20. Contact类:
  21. @Data
  22. @AllArgsConstructor
  23. @NoArgsConstructor
  24. public class Contact {
  25.     private String name;
  26.     private int id;
  27.     private String email;
  28.     private char gender;
  29. }
  30. 测试代码:
  31. //目标:解析XML文件,使用dom4框架
  32. public class Dom4JTest02 {
  33.     public static void main(String[] args) throws Exception {
  34.         //1. 创建一个saxReader对象
  35.         SAXReader saxReader = new SAXReader();
  36.         //2. 把xml文件读成一个document对象
  37.         Document doc = saxReader.read("day11-special-file-log-code\\src\\Contacts.xml");
  38.         //3. 文档中包含了XML的全部数据,提供了方法获取数据
  39.         Element rootElement = doc.getRootElement();
  40.         //4. 准备一个联系人集合存储联系人对象
  41.         List<Contact> names = new ArrayList<>();
  42.         //5. 提取全部全部一级联系人对象
  43.         List<Element> sonEles = rootElement.elements("contact");
  44.         //6. 遍历每个元素对象
  45.         for (Element sonEle : sonEles) {
  46.             //7.每个元素是一个联系人对象,创建联系人对象,封装数据。
  47.             Contact contact = new Contact();
  48.             // 注入数据
  49.             contact.setId(Integer.valueOf(sonEle.attributeValue("id")));
  50.             contact.setName(sonEle.elementTextTrim("name"));
  51.             contact.setEmail(sonEle.elementTextTrim("email"));
  52.             contact.setGender(sonEle.elementTextTrim("gender").charAt(0));
  53.             //8. 把联系人对象存入集合中
  54.             names.add(contact);
  55.         }
  56.         System.out.println(names);
  57.     }
  58. }
复制代码
核心配置文件Logback.xml

  • 对logback日志框架进行控制的。
日志的输出位置、输出格式的设置

  • 通常可以设置2个输出日志的位置:一个是控制台、一个是系统文件中
  1. [/code][b]开始日志(ALL), 取消日志(OFF)[/b]
  2. [code]public static final logger LOGGER = loggerFactory.getLogger("类名");
复制代码
什么是日志级别?

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

    为什么要学习日志级别?
  1. public static final logger LOGGER = loggerFactory.getLogger("类名");
复制代码

  • 只有日志级别是大于等于核心配置文件配置的日志级别,才会被记录,否则不记录。

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

3 天前

举报

谢谢分享,试用一下
您需要登录后才可以回帖 登录 | 立即注册