配置文件:properties和xml
1.properties配置文件
1.1相关知识点
1.1.1创建放配置文件的resources文件夹,并且设置编码格式

Step1

step2

step3
1.1.2 Properties 类 get() 和getProperty()的区别
Properties类继承了HashTable 的get() 方法 返回的是 一个泛型 即Object对象
而getProperty 则是返回的是String 所以我们通常用 getProperty();
1.1.3相对路径的原理
InputStream in=Thread.currentThread().getContextClassLoader()
.getResourceAsStream("contacts.xml");
Document document = DocumentBuilderFactory.newInstance()
.newDocumentBuilder().parse(in);

Step1

Step2

Step3

Step4
归结起来就是,编译后所有文件去了bin文件夹,除了scr源文件,其他所有资源文件一股脑加载进bin目录,getResourcesAsStream(String 文件名),则是去classpath下找这个文件,自动把文件名拼接在 …bin/ 后面
1.2 Demo1 从properties配置文件中取值
public static void main(String[] args) throws Exception {
//1.防止出现中文代码 需要转换流 或者 FileReader
InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream("user.properties");
Properties properties=new Properties();
InputStreamReader ir=new InputStreamReader(in);
properties.load(ir);
String username = properties.getProperty("username");
String password = properties.getProperty("password");
System.out.println("username:"+username);
System.out.println("password:"+password);
}
Attention
- 为防止出现中文乱码 ,如果配置文件中有中文字符串,需要先转为转换流InputStreamReader 或者FileReader 再load进内存中的Properties对象
- 用多态创建转换流时,注意字符流对应的父类接口是Reader 和 Writer
而字节流对应的父类接口是 InputStream 和 OutputStream - 运用转换流同时可以识别properties 中的 中文的key 同时输出中文的value
2.xml配置文件
2.1 相关知识点
2.1.1 xml语法

2.1.2 Node和 其子接口

DOM中 一切皆节点
2.2 Demo 从xml中获得获得第二个联系人的姓名(Test1)和 从xml中获得全部联系人信息(Test2)
<?xml version="1.0" encoding="UTF-8"?>
<contacts>
<linkman>
<username>Alan</username>
<age>23</age>
</linkman>
<linkman>
<username>哈哈哈</username>
<age>123</age>
</linkman>
</contacts>
public class XmlTest {
private InputStream in;
@Before
public void init() {
in = Thread.currentThread().getContextClassLoader().getResourceAsStream("contacts.xml");
}
//需求一:获得第二个联系人的对象
@Test
public void TestGetInfo() throws Exception {
//1.得到相应的Document对象
Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(in);
//2.获得根标签
Element documentElement = document.getDocumentElement();
//3.获得其子元素 linkman
NodeList list = documentElement.getElementsByTagName("linkman");
Element linkman2=(Element) list.item(1);
Element nameEle=(Element)linkman2.getElementsByTagName("username").item(0);
String name = nameEle.getTextContent();
System.out.println(name);
}
//需求二:获得全部 联系人信息
@Test
public void TestGetInfo2() throws Exception {
Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(in);
NodeList list = document.getElementsByTagName("linkman");
List<Linkman> linkmans=new ArrayList<Linkman>();
//3.遍历
for(int i=0;i<list.getLength();i++) {
Element element=(Element)list.item(i);
Element nameEml=(Element)element.getElementsByTagName("username").item(0);
String name = nameEml.getTextContent();
Element ageEml=(Element)element.getElementsByTagName("age").item(0);
int age = Integer.parseInt(ageEml.getTextContent());
Linkman linkman=new Linkman(name, age);
linkmans.add(linkman);
}
for (Linkman linkman : linkmans) {
System.out.println(linkman);
}
}
Attention
-
成员变量 private InputStream in ; 默认值为 null;
即private InputStream in =null; -
实现了 Iterable接口 才能直接遍历(如增强for) NodeList类虽然是Node 的集合 ,但没有实现 Iterable 接口 故只能用 普通循环遍历和 item() 方法遍历
-
抽象类 如DocumentBuilder 和 DocumentBuilderFactory 本身没有构造方法 需由其他方法返回 对象本身 如DocumentBuilderFactory的newInstance()方法
和 DocumentBuilderFactory 的newDocumentBuilder() 方法
本文详细介绍如何使用Java读取和解析properties与xml配置文件,包括properties文件的加载与中文处理,以及xml文件的DOM解析方法,适用于后端开发人员。
1438

被折叠的 条评论
为什么被折叠?



