属性文件
格式
.properties
结尾
属性文件里面的每一行都是一个键值对,键和值中间用=隔开。比如: admin=123456
#
表示这样是注释信息,是用来解释这一行配置是什么意思
每一行末尾不要习惯性加分号,以及空格等字符;不然会把分号,空格会当做值的一部分
Properties类
示例代码:
//读取属性文件
public static void main(String[] args) throws Exception {
Properties ppts = new Properties();
FileReader fileReader = new FileReader("01.Properties");
//通过字符流读取属性文件内数据,加载进Properties对象
ppts.load(fileReader);
System.out.println(ppts);
//获取所有的Key键
Set<String> strings = ppts.stringPropertyNames();
//增强for遍历键
for (String s : strings) {
//通过键获取值
System.out.println(s + "=" + ppts.getProperty(s));
}
}
//写入数据文件
public static void main(String[] args) throws Exception {
Properties ppts = new Properties();
//设置键值对
ppts.setProperty("dbname","root");
ppts.setProperty("dbpassword","123456");
ppts.setProperty("dbport","3306");
ppts.setProperty("dbtype","MySql");
FileWriter fileWriter = new FileWriter("01.Properties");
//将键值对写入属性文件,引号内为注释,可留空
ppts.store(fileWriter,"");
System.out.println(ppts);
}
XML文件
特点
标签一般成对出现
标签名可以自定义,但必须要正确嵌套
只能有一个根标签
可以有属性
第一行必须有文档声明,
XML文件必须以.xml为后缀结尾
注意事项
<,>,&
如果标签文本中有这些特殊字符,需要用一些占位符代替。
< 表示 <
> 表示 >
& 表示 &
' 表示 ‘
" 表示 “
如果在标签文本中,出现大量的特殊字符,不想使用特殊字符,可以用CDATA区:
<![CDATA[
3 < 2 && 5 > 4
]]>
XML解析
使用Dom4j框架解析:需要去官网下载 导进项目
Dom4J解析XML文件的思想是:文档对象模型(意思是把整个XML文档、每一个标签、每一个属性都等都当做对象来看待)。Dowument对象表示真个XML文档、Element对象表示标签(元素)、Attribute对象表示属性、标签中的内容就是文本
Dom4J解析XML实例代码:
public static void main(String[] args) throws Exception {
//创建解析器对象,用于解析xml文件
SAXReader saxReader = new SAXReader();
//读取xml文件,封装成文档对象
Document document = saxReader.read("day11/src/com/itheima/b_xml/helloworld.xml");
//获得根元素
Element rootElement = document.getRootElement();
//获得当前元素的名字
String name = rootElement.getName();
System.out.println("根元素标签名:" + name);
//获得当前元素的所有子元素
List<Element> elementList = rootElement.elements();
//遍历子元素
for (Element element : elementList) {
String elementName = element.getName();
String idValue = element.attributeValue("id");
System.out.println(elementName + "属性值:" + idValue);
List<Element> elements = element.elements();
for (Element ele : elements) {
String eleName = ele.getName();
String text = ele.getText();
System.out.println(eleName + "标签的文本内容为:" + text);
}
}
}
XML约束
DTD约束案例:
<!ELEMENT 书架(书+)> 表示根标签是<书架>,并且书架中有子标签<书>
<!ELEMENT 书(书名、作者、售价)> 表示书是一个标签,且书中有子标签<书名>、<作者>、<售价>
<!ELEMENT 书名(#PCDATA)> 表示<书名>是一个标签,且<书名>里面是普通文本
<!ELEMENT 作者(#PCDATA)> 表示<作者>是一个标签,且<作者>里面是普通文本
<!ELEMENT 售价(#PCDATA)> 表示<售价>是一个标签,且<售价>里面是普通文本
Schame约束案例:
<?xml version="1.0" encoding="UTF-8" ?>
<!-- xsd约束的根标签为<schema> xmlns="http://www.w3.org/2001/XMLSchema"(该文件被W3C的提供的内容约束)-->
<!-- targetNamespace="http://www.itcast.cn"(指定当前约束的URL) 网址不需要存在(和其他的XSD约束不重复)-->
<!-- elementFormDefault="qualified" (质量良好的约束文件)-->
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.itcast.cn"
elementFormDefault="qualified">
<!-- 通过标签的方式来进行约束的声明 <element name='标签名'> -->
<element name="students">
<complexType>
<sequence>
<element name="student" minOccurs="1" maxOccurs="unbounded">
<complexType>
<sequence>
<element name="id" type="string"/> <!-- 简单元素的声明 -->
<element name="name" type="string"/> <!-- 简单元素的声明 -->
<element name="age" type="int"/> <!-- 简单元素的声明 -->
</sequence>
<attribute name="name" type="string" use="required"/>
</complexType>
</element>
</sequence>
</complexType>
</element>
</schema>
日志技术
好处
Logback快速入门
示例代码:
public class Demo {
//获得一个日志记录器对象
public final static Logger logger = LoggerFactory.getLogger(Demo.class);
public static void main(String[] args) {
//通过记录器对象来记录日志信息
logger.trace("系统的调试信息,比较基本信息");
logger.debug("系统的调试信息,方便追踪程序的执行流程");
logger.info("系统中产生的普通信息");
logger.warn("系统的警告信息");
logger.error("系统产生的异常信息");
}
}
日志配置文件–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>log/data.log</file>
<!--指定日志文件拆分和压缩规则-->
<rollingPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--通过指定压缩文件名称,来确定分割文件方式-->
<fileNamePattern>log/data-%i-%d{yyyy-MM-dd}-.log.gz</fileNamePattern>
<!--文件拆分大小-->
<maxFileSize>1MB</maxFileSize>
</rollingPolicy>
</appender>
<!--
1、控制日志的输出情况:如,开启日志,取消日志
-->
<!-- 此处可配置日志级别-->
<root level="ALL">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE" />
</root>
</configuration>