properties 属性文件
- 里边存放 键值对
- 键不能重复
- 文件后缀一般是 properties 结尾的
使用properties读取属性文件
public class PropertiesTest1 {
public static void main(String[] args) throws Exception {
//1.创建一个properties对象
Properties properties = new Properties();
System.out.println(properties);
//2.开始加载属性文件中的键值对到properties中去
properties.load(new FileReader("properties-xml-log-app\\src\\users.properties"));
System.out.println(properties);
//3.根据键取值
System.out.println(properties.getProperty("张琳"));
//4.遍历全部的键和值
Set<String> keys = properties.stringPropertyNames();
for (String key : keys) {
System.out.println(key+"-->"+properties.getProperty(key));
}
properties.forEach((k,v)-> System.out.println(k+"-->"+v));
}
}
使用properties把键值对数据写出到属性文件中去
public class PropertiesTest2 {
public static void main(String[] args) throws Exception {
//1.创建properties对象,先用他存储一些键值对数据
Properties properties =new Properties();
properties.setProperty("张三","123");
properties.setProperty("李四","456");
//2.把properties中的键值对数据存入到属性文件中去
properties.store(new FileWriter("properties-xml-log-app\\src\\users2.properties"),"cc");
}
}
XML 可扩展标记语言
- XML是由标签组成的
- XML中的标签名可以自己定义(可扩展)
- XML中只能有一个根标签
- XML中的标签可以有属性
- 如果一个文件中放置的是XML格式的数据,后缀是.xml
语法规则
- XML中书写 < & ' " 会导致冲突,可以用如下字符代替
< < 小于
> > 大于
& & 和号
' ' 单引号
" " 双引号
- XML中可以写一个叫CDATA 的数据区:<![CDATA[....内容....]]>,里边内容可以随便写
<data>
<![CDATA[
3 <2 && 5 > 4
]]>
</data>
使用程序读取XML文件中的数据(Dom4j)
public class Dom4jTest1 {
public static void main(String[] args) throws Exception {
//1.创建一个Dom4j框架提供的解析器对象
SAXReader saxReader = new SAXReader();
//2.使用saxReader对象吧需要解析的文件读成Document文件
Document document = saxReader.read("properties-xml-log-app\\src\\helloword.xml");
//3.从文档对象中解析xml文件的全部信息
Element root = document.getRootElement();
System.out.println(root.getName());
//4.获取根元素下的全部一级子元素
// List<Element> elements = root.elements();
//指定获取 user
List<Element> elements = root.elements("user");
for (Element element : elements) {
System.out.println(element.getName());
}
//5.获取当前元素下的某个子元素
Element people = root.element("people");
System.out.println(people.getText());
//如果有很多子元素,默认获取第一个
Element user = root.element("user");
System.out.println(user.elementText("name"));
//6.获取元素的属性信息
Attribute id = user.attribute("id");
System.out.println(id.getName());
System.out.println(id.getValue());
//7.获取全部文本内容
System.out.println(user.elementText("name"));
System.out.println(user.elementText("sex"));
System.out.println(user.elementText("password"));
Element data = user.element("data");
System.out.println(data.getText());
System.out.println(data.getTextTrim());//读取文本去除空格
}
}
使用程序把数据写出到XML文件中去
直接把程序里的数据拼接成XML格式,然后IO流写出去
public class Test2 {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\r\n");
sb.append("<book>\r\n");
sb.append("<name>从入门到跑路</name>\r\n");
sb.append("</book>\r\n");
try (
BufferedWriter bw = new BufferedWriter(new FileWriter("properties-xml-log-app\\src\\book.xml"));
){
bw.write(sb.toString());
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
约束XML文件的书写
就是限制XML文件只能按照某种格式书写,比如:限制标签,属性应该怎么写
- DTD文档
- Schema文档:可以约束数据类型
日志文件
- 可以将系统执行的信息,方便的记录到指定的位置(控制台,文件,数据库)
- 可以随时以开关的形式控制日志的启停,无需侵入到源代码中进行修改
LogBack: slf4j-api 日志接口 logback-core logback-classic
必须把logback.xml(对LogBack日志框架进行控制)直接拷贝到src目录下
public class LogBackTest1 {
public static final Logger LOGGER = LoggerFactory.getLogger("LogBackTest");
public static void main(String[] args) {
//创建一个Logger日志对象
try{
LOGGER.info("chu方法开始执行---");
chu(10,0);
LOGGER.info("chu方法执行成功---");
}catch(Exception e){
LOGGER.error("chu方法执行失败了,出现了bug");
}
}
public static void chu(int a,int b){
int c = a/b;
System.out.println("结果是:"+c);
}
}
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:/idea/log/data.log</file>
<!--指定日志文件拆分和压缩规则-->
<rollingPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--通过指定压缩文件名称,来确定分割文件方式-->
<fileNamePattern>D:/idea/log/data%i-%d{yyyy-MM-dd}.log.gz</fileNamePattern>
<!--文件拆分大小-->
<maxFileSize>1MB</maxFileSize>
</rollingPolicy>
</appender>
<!--
level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR | ALL 和 OFF
, 默认debug
<root>可以包含零个或多个<appender-ref>元素,标识这个输出位置将会被本日志级别控制。
-->
<!--ALL 开启日志 OFF 关闭日志-->
<root level="ALL">
<!-- 注意:如果这里不配置关联打印位置,该位置将不会记录日志-->
<appender-ref ref = "CONSOLE"/>
<appender-ref ref="FILE" />
</root>
</configuration>
logback设置日志级别
优先级由低到高
日志级别 | 说明 |
trace | 追踪,指明程旭运行轨迹 |
debug | 调试,实际应用中一般将其作为最低级别,而trace很少使用 |
info | 输出重要信息, 数据连接, 网络连接, io操作等等, 使用较多 |
warn | 警告问题, 可能会发生问题, 使用较多 |
error | 错误信息, 使用较多 |
level 等于 info 时,只有大于等于 info 的日志才会被记录
<root level="ALL">
<!-- 注意:如果这里不配置关联打印位置,该位置将不会记录日志-->
<appender-ref ref = "CONSOLE"/>
<appender-ref ref="FILE" />
</root>