• Day10配置文件&日志&多线程


    配置文件

    在企业开发过程中,我们习惯把一些需要灵活配置的数据放在一些文本文件中,而不是在Java代码写死 我们把这种存放程序配置信息的文件,统称为配置文件

    properties 

    是一个Map集合(键值对集合),但是我们一般不会当集合使用。

    核心作用:Properties是用来代表属性文件的,通过Properties可以读写属性文件里的内容 

     

     使用Properties读取属性文件里的键值对数据 

     

    使用Properties把键值对数据写出到属性文件里去 

     

    1. public class Demo1 {
    2. public static void main(String[] args)throws IOException {
    3. //1. 创建一个配置文件对象
    4. Properties properties = new Properties();
    5. properties.setProperty("name","卷王");
    6. properties.setProperty("age","18");
    7. properties.store(new FileWriter("E:\\Code191Day\\day10\\a-1.properties"),"卷王个人介绍");
    8. //2. 读取
    9. properties.load(new FileReader("E:\\Code191Day\\day10\\a-1.properties"));
    10. System.out.println(properties.getProperty("name"));
    11. System.out.println(properties.getProperty("age"));
    12. Set set = properties.stringPropertyNames();
    13. for (String s : set) {
    14. System.out.println(s + properties.getProperty(s));
    15. }
    16. }
    17. }

     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)    设置键值

    XML

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

     

    XML的特点

    1.XML中的“<标签名>” 称为一个标签或一个元素,一般是成对出现的。

    2.XML中的标签名可以自己定义(可扩展),但必须要正确的嵌套。

    3.XML中只能有一个根标签。

    4.XML中的标签可以有属性。

    5.如果一个文件中放置的是XML格式的数据,这个文件就是XML文件,后缀一般要写成.xml 

     XML的语法规则

    1.XML文件的后缀名为:xml,文档声明必须是第一行

     

    version:XML默认的版本号码、该属性是必须存在的

    encoding:本XML文件的编码

    2.XML中可以定义注释信息:,快捷键是Ctrl+shift+/

    3.XML中书写”<”、“&”等,可能会出现冲突,导致报错,此时可以用如下特殊字符替代。

        <    <  小于

        >    >  大于

       &   &  和号

       '  '  单引号

       "  "  引号

    4.XML中可以写一个叫CDATA的数据区: ,里面的内容可以随便写。

    XML的作用和应用场景 

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

    应用场景:经常用来做为系统的配置文件;或者作为一种特殊的数据结构,在网络中进行传输。 

     

     XML的作用

    XML的是一种可扩展的标记语言。

    作用:1)作为软件的配置文件   2)用于进行存储数据和传输数据 

    解析XML文件

    Dom4j解析XML-得到Document对象 

     

    DOM4J解析XML文件的思想:文档对象模型 
    1. "1.0" encoding="UTF-8" ?>
    2. "1">
    3. 张无忌
    4. minmin
    5. 光明顶
    6. "2">
    7. 敏敏
    8. wuji
    9. 光明顶
    1. public class Demo2 {
    2. public static void main(String[] args) throws DocumentException {
    3. List list = new ArrayList<>();
    4. //1.使用SAXReader读取XML,封装成Document
    5. SAXReader saxReader = new SAXReader();
    6. Document read = saxReader.read("E:\\Code191Day\\day10\\b-2.xml");
    7. //获取跟节点
    8. Element rootElement = read.getRootElement();
    9. //获取根元素下的子元素
    10. List elements = rootElement.elements();
    11. //遍历集合获取每个元素
    12. for (Element element : elements) {
    13. String id = element.attributeValue("id");
    14. String name = element.element("name").getText();
    15. String password = element.element("password").getText();
    16. String address = element.element("address").getText();
    17. String gender = element.element("gender").getText();
    18. User user = new User(Integer.valueOf(id),name,password,address,gender);
    19. list.add(user);
    20. }
    21. list.stream().forEach(System.out::println);
    22. }
    23. }
    Element提供的方法 

     

    约束文档 

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

    约束文档的分类 

    1.DTD文档

    2.Schema文档 

    日志技术 

              程序中的日志,通常就是一个文件,里面记录的是程序运行过程中的各种信息。 

    1.可以将系统执行的信息,方便的记录到指定的位置(控制台、文件中、数据库中)。

    2.可以随时以开关的形式控制日志的启停,无需侵入到源代码中去进行修改。 

    Logback日志框架 

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

    1.slf4j-api:日志接口

    2.logback-core

    3.logback-classic 

    实现步骤 

     

     

    1. public class Demo1 {
    2. public static final Logger LOGGER = LoggerFactory.getLogger("Demo1");
    3. public static void main(String[] args) {
    4. LOGGER.debug("哈哈哈");
    5. LOGGER.error("除法报错");
    6. try {
    7. LOGGER.warn("除数为0");
    8. sum(10, 2);
    9. }catch (Exception e){
    10. LOGGER.error("除法报错");
    11. }
    12. }
    13. public static int sum(int a,int b){
    14. LOGGER.info("输入的参数:a={},b={}",a,b);
    15. int c = a / b;
    16. return c;
    17. }
    18. }

     日志级别

     

    多线程 

    1.单线程:在计算机中同一时间只能做一件事

    2.多线程:在计算机中同一时间可以做多件事 

    1. public class Demo1 {
    2. public static final Logger logger = LoggerFactory.getLogger("Demo1");
    3. public static void main(String[] args) {
    4. //需求:创建两个线程,分别用于打印10个A和10个B,最后观察下输出顺序
    5. new Thread(){
    6. @Override
    7. public void run() {
    8. Thread.currentThread().setName("卷王线程");
    9. for (int i = 0; i < 10; i++) {
    10. logger.info(Thread.currentThread().getName() + i);
    11. }
    12. }
    13. }.start();
    14. new Thread(){
    15. @Override
    16. public void run() {
    17. Thread.currentThread().setName("阿giao线程");
    18. for (int i = 0; i < 10; i++) {
    19. logger.info( Thread.currentThread().getName() + i);
    20. }
    21. }
    22. }.start();
    23. }
    24. }

     线程的创建方式

    方式一继承Thread类 

    1.定义一个子类继承线程类java.lang.Thread,

    2.重写run()方法 创建子类的对象

    3.调用子类对象的start()方法启动线程(底层会自动去执行run方法) 

    1. public class Demo1 {
    2. public static final Logger logger = LoggerFactory.getLogger("Demo1");
    3. public static void main(String[] args) {
    4. //需求:创建两个线程,分别用于打印10个A和10个B,最后观察下输出顺序
    5. new Thread(){
    6. @Override
    7. public void run() {
    8. Thread.currentThread().setName("卷王线程");
    9. for (int i = 0; i < 10; i++) {
    10. logger.info(Thread.currentThread().getName() + i);
    11. }
    12. }
    13. }.start();
    14. new Thread(){
    15. @Override
    16. public void run() {
    17. Thread.currentThread().setName("阿giao线程");
    18. for (int i = 0; i < 10; i++) {
    19. logger.info( Thread.currentThread().getName() + i);
    20. }
    21. }
    22. }.start();
    23. }
    24. }

     多线程的创建方式二:实现Runnable接口

     

    1. public class Demo1 {
    2. public static final Logger logger = LoggerFactory.getLogger("Demo1");
    3. public static void main(String[] args) {
    4. //需求:创建两个线程,分别用于打印10个A和10个B,最后观察下输出顺序
    5. new Thread(() -> {
    6. for (int i = 0; i < 10; i++) {
    7. logger.info("Agiao = {}", i);
    8. }
    9. },"Agiao"){
    10. }.start();
    11. new Thread(() -> {
    12. for (int i = 0; i < 10; i++) {
    13. logger.info("展丫鹏 = {}" , i);
    14. }
    15. },"展丫鹏"){
    16. }.start();
    17. }
    18. }

    多线程的第三种创建方式:利用Callable接口、FutureTask类来实现

     

    1. public class Demo1 {
    2. public static final Logger logger = LoggerFactory.getLogger("Demo1");
    3. public static void main(String[] args) throws ExecutionException, InterruptedException {
    4. //需求:启动两个子线程,分别计算100之内的奇数的和和偶数的和,然后在主线程中再做个汇总,得到总和
    5. //2.创建任务类对象
    6. OddCallable oddCallable = new OddCallable();
    7. EvenCallable evenCallable = new EvenCallable();
    8. //3.创建未来任务的对象,可以获取线程执行的结果
    9. FutureTask integerFutureTask1 = new FutureTask<>(oddCallable);
    10. FutureTask integerFutureTask2 = new FutureTask<>(evenCallable);
    11. //4.创建线程类
    12. Thread thread1 = new Thread(integerFutureTask1,"计算奇数");
    13. Thread thread2 = new Thread(integerFutureTask2,"计算偶数");
    14. //5.启动线程
    15. thread1.start();
    16. thread2.start();
    17. //6.从FutureTask对象中获取线程执行结果
    18. //假设结果还没有算出来,线程会在此等待
    19. Integer oddSum = integerFutureTask1.get();
    20. Integer evenSum = integerFutureTask2.get();
    21. logger.info("{}",oddSum + evenSum);
    22. }
    23. }
    24. class OddCallable implements Callable{
    25. @Override
    26. public Integer call() throws Exception {
    27. int sum = 0;
    28. for (int i = 1; i <= 100; i+=2) {
    29. sum += i;
    30. }
    31. return sum;
    32. }
    33. }
    34. class EvenCallable implements Callable{
    35. @Override
    36. public Integer call() throws Exception {
    37. int sum = 0;
    38. for (int i = 0; i <= 100; i+=2) {
    39. sum += i;
    40. }
    41. return sum;
    42. }
    43. }

    请对对比说一下三种线程的创建方式,和不同点? 

     

     

  • 相关阅读:
    Python Selenium Headless:以 Headless 模式打开 Chrome 浏览器
    R语言kaggle 游戏数据探索与可视化
    字符串压缩(三)之短字符串压缩
    vue 02
    一款云渗透工具 - Sea Moon
    【LeetCode热题100】【图论】岛屿数量
    php获取客户端ip地址及ip所在国家、省份、城市、县区
    go 这样做就是python
    C++:C++11 和 设计模式
    【学习笔记】倍增 + 二分
  • 原文地址:https://blog.csdn.net/m0_60388241/article/details/134042222