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 |
获取全部键的集合(其实就是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 中书写"<" "&"等可能会出现冲突,导致报错,此时可以用如下字符代替:
< 小于 >大于 &和 '单引号 " 引号
-
XML中可以写一个叫CDATA的数据区:
< ![CDATA[ …内容… ]]> //快捷键:大写的CD
里面的内容可以随便写。
XML的特点
- XML中的“<标签名>” 称为一个标签或一个元素,一般是成对出现的。
- XML中的标签名可以自己定义(可扩展),但必须要正确的嵌套。
- XML中只能有一个根标签。
- XML中的标签可以有属性。
- 如果一个文件中放置的是XML格式的数据,这个文件就是XML文件,后缀一般要写成.xml。
XML的作用与场景
- XML作用:本质是一种数据的格式,可以用来存储复杂的数据结构,和数据关系
- 应用场景:经常用来作为系统的配置文件;或者作为一种特殊的数据结构,在网络中进行传输。
XML文件解析
使用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 |
得到当前元素下所有子元素 |
public List |
得到当前元素下指定名字的子元素返回集合 |
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接口
- 定义类实现Runnable接口(runnable不是线程,只是线程要执行的任务)
- 重写run方法
- 创建Runnable实现类对象
- 创建Thread对象,在参数中需要传入Runnable实现类对象
- 调用start方法启动线程
线程创建方式二的匿名内部类写法
- 可以创建Runnable的匿名内部类对象。
- 再交给Thread线程对象。
- 再调用线程对象的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
![集合回顾](D:\Program Files\feiq\Recv Files\集合回顾.jpg)
标签:XML,String,对象,day20,线程,日志,public From: https://www.cnblogs.com/xkh-blogs/p/17250329.html