day20

发布时间 2023-03-24 09:45:07作者: 萌新小夏

day20

快捷键:Ctrl+q;Ctrl+q;可以显示函数参数

1.特殊文件

两种特殊的文本文件,一种是properties文件,还有一种是xml文件

  • 后缀为.properties的文件,称之为属性文件,它可以很方便的存储一些类似于键值对的数据。经常当做软件的配置文件使用。
  • 而xml文件能够表示更加复杂的数据关系,比如要表示多个用户的用户名、密码、家乡、性别等。在后面,也经常当做软件的配置文件使用。

1.1Properties

  • 是一个Map集合
  • 核心作用:代表属性文件,通过Properties可以读写属性文件里的内容
构造器 说明
public Properties() 用于构建Properties集合对象(空容器)
常用方法 说明
public void load(InputStream is) 通过字节输入流,读取属性文件里的键值对数据
public void load(Reader reader) 通过字符输入流,读取属性文件里的键值对数据
public String getProperty(String key) 根据键获取值(其实就是get方法的效果)
public Set stringPropertyNames() 获取全部键的集合(其实就是keySet方法的效果)
常用方法 说明
public Object setProperty(String key, String value) 保存键值对数据到Properties对象中去。
public void store(OutputStream os, String comments) 把键值对数据,通过字节输出流写出到属性文件里去
public void store(Writer w, String comments) 把键值对数据,通过字符输出流写出到属性文件里去

1.2XML文件

XML(全程Extensible Markup Language,可扩展标记语言)

  • 标记语言:通过标签来描述数据的一门语言
  • 可扩展:标签的名字时可以定义的
  • XML作用:本质是一种数据的格式,可以用来存储复杂的数据结构,和数据关系。

语法规则

  • 后缀名为:xml

  • 文档声明必须是第一行

  • xml中可以定义注释信息<!– 注释内容- ->建议使用快捷键ctrl+/

  • xml 中书写"<" "&"等可能会出现冲突,导致报错,此时可以用如下字符代替:

    &lt; 小于 &gt;大于  &amp;和 &apos;单引号 &quot; 引号
    
  • XML中可以写一个叫CDATA的数据区:

    < ![CDATA[  …内容… ]]> //快捷键:大写的CD
    

    里面的内容可以随便写。

XML的特点

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

XML的作用与场景

  • XML作用:本质是一种数据的格式,可以用来存储复杂的数据结构,和数据关系
  • 应用场景:经常用来作为系统的配置文件;或者作为一种特殊的数据结构,在网络中进行传输。

XML文件解析

image-20230319112554638

使用Dom4j解析出XML文件

lSAXReader:Dom4j提供的解析器,可以认为是代表整个Dom4j框架

构造器/方法 说明
public SAXReader() 构建Dom4J的解析器对象
public Document read(String url) 把XML文件读成Document对象
public Document read(InputStream is) 通过字节输入流读取XML文件

Document

方法名 说明
Element getRootElement() 获得根元素对象

Element提供的方法

方法名 说明
public String getName() 得到元素名字
public List elements() 得到当前元素下所有子元素
public List elements(String name) 得到当前元素下指定名字的子元素返回集合
public Element element(String name) 得到当前元素下指定名字的子元素,如果有很多名字相同的返回第一个
public String attributeValue(String name) 通过属性名直接得到属性值
public String elementText(子元素名) 得到指定名称的子元素的文本
public String getText() 得到文本

XML文档约束

XML约束指的是限制XML文件中的标签或者属性,只能按照规定的格式写。

  • DTD文档约束
  • Schema文档(后缀.xsd)

1.3日志

  • 好比生活中的日记,可以记录你生活中的点点滴滴
  • 可以将系统执行的信息,方便的记录到指定的位置(控制台/文件中/数据库中)

日志技术

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

日志技术的体系结构

日志框架:牛人或者第三方公司已经做好的实现代码,后来者直接可以拿去使用。推荐使用Logback

日志接口:设计日志框架的一套标准,日志框架需要实现这些接口。

注意1:因为对Commons Logging接口不满意,有人就搞了SLF4J;因为对Log4j的性能不满意,有人就搞了Logback。

注意2:Logback是基于slf4j的日志规范实现的框架。

使用Logback
使用Logback日志框架,记录系统的运行信息。
实现步骤
①:导入Logback框架到项目中去。

②:将Logback框架的核心配置文件logback.xml直接拷贝到src目录下(必须是src下)。
③:创建Logback框架提供的Logger对象,然后用Logger对象调用其提供的方法就可以记录系统的日志信息。

Logback框架的核心配置文件logback.xml

日志级别

控制日志的输出情况:如,开启日志 ALL,取消日志 OFF
日志级别 说明
trace 追踪,指明程序运行轨迹
debug 调试,实际应用中一般将其作为最低级别,而 trace 则很少使用
info 输出重要的运行信息,数据连接、网络连接、IO操作等等,使用较多
warn 警告信息,可能会发生问题,使用较多
error 错误信息, 使用较多

多线程

多线程基础

单线程只能同时执行一个任务

多线程可以同时执行多个任务

进程:

是一个正在运行的程序

线程:

线程时进程的执行单元

通俗的说:线程就是来执行代码的

  • 一个进程最少有一个线程
  • 一个进程也可有多个线程,称为多线程程序

并行

多个事件在同一时刻,同时执行

并发

多个事件在同一时刻交替执行

多线程运行原理

CPU在多个线程间快速切换,造成“同时”运行的假象

创建多线程

如何在程序中创建出多条线程?

Java是通过java.lang.Thread 类的对象来代表线程的。

多线程的创建方式一:继承Thread类

①定义一个子类MyThread继承线程类java.lang.Thread,重写run()方法

②创建MyThread类的对象

③调用线程对象的start()方法启动线程(启动后还是执行run方法的)

方式一的优缺点:

优点:编码简单

缺点:线程类已经继承Thread,无法继承其他类,不利于功能的扩展。

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

  1. 定义类实现Runnable接口(runnable不是线程,只是线程要执行的任务
  2. 重写run方法
  3. 创建Runnable实现类对象
  4. 创建Thread对象,在参数中需要传入Runnable实现类对象
  5. 调用start方法启动线程

线程创建方式二的匿名内部类写法

  1. 可以创建Runnable的匿名内部类对象。
  2. 再交给Thread线程对象。
  3. 再调用线程对象的start()启动线程。

方式二的优缺点

优点:任务类只是实现接口,可以继续继承其他类、实现其他接口,扩展性强。
缺点:需要多一个Runnable对象。

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

假如线程执行完毕后有一些数据需要返回,他们重写的run方法均不能直接返回结果。

  • 创建任务对象
  • 定义一个类实现Callable接口,重写call方法,封装要做的事情,和要返回的数据。
  • 把Callable类型的对象封装成FutureTask(线程任务对象)。
  • 把线程任务对象交给Thread对象。
  • 调用Thread对象的start方法启动线程。
  • 线程执行完毕后、通过FutureTask对象的的get方法去获取线程任务执行的结果。

FutureTask类

FutureTask提供的构造器 说明
public FutureTask<>(Callable call) 把Callable对象封装成FutureTask对象。
FutureTask提供的方法 说明
public V get() throws Exception 获取线程执行call方法返回的结果。

方式三的优缺点

优点:线程任务类只是实现接口,可以继续继承类和实现接口,扩展性强;可以在线程执行完毕后去获取线程执行的结果。
缺点:编程复杂一点。

方式 优点 缺点
继承Thread类 编程比较简单,可以直接使用Thread类中的方法 扩展性较差,不能再继承其他的类,不能返回线程执行的结果
实现Runnable接口 扩展性强,实现该接口的同时还可以继承其他的类。 编程相对复杂,不能返回线程执行的结果
实现Callable接口 扩展性强,实现该接口的同时还可以继承其他的类。可以得到线程执行的结果 编程相对复杂,可

多线程的注意事项

一个线程对象只能调用一次start方法

直接调用run方法会当成普通方法执行,此时相当于还是单线程执行。
只有调用start方法才是启动一个新的线程执行。

这样主线程一直是先跑完的,相当于是一个单线程的效果了。

集合回顾

单列集合

List体系有索引

Set体系无索引

ArrayList:数组

LinkedList:链表,特有方法-操作头尾

Set没有索引

Set不能获取一个,只能遍历整个集合

HashSet:底层是哈希表

TreeSet:红黑树

增:add(元素)、add(索引,元素)

删:remove(元素) remove(索引)

改:set(索引,元素)

查:get(索引)

contains(元素):集合是否包含这个元素

双列集合

增:put(键,值)

删:remove(键)

改:put(键,值)

查:get(键)

Map没有索引

HashMap:底层是哈希表

TreeMap: 底层是红黑树

注意:Hash系列集合要重写hashCode和equals方法去除重复

Tree系列集合一定要排序,元素类实现Comparable接口,或者给比较器Comparator

image-20230320090725669

![集合回顾](D:\Program Files\feiq\Recv Files\集合回顾.jpg)