配置文件:properties和xml

本文详细介绍如何使用Java读取和解析properties与xml配置文件,包括properties文件的加载与中文处理,以及xml文件的DOM解析方法,适用于后端开发人员。

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

  1. 为防止出现中文乱码 ,如果配置文件中有中文字符串,需要先转为转换流InputStreamReader 或者FileReader 再load进内存中的Properties对象
  2. 用多态创建转换流时,注意字符流对应的父类接口是Reader 和 Writer
    而字节流对应的父类接口是 InputStream 和 OutputStream
  3. 运用转换流同时可以识别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

  1. 成员变量 private InputStream in ; 默认值为 null;
    即private InputStream in =null;

  2. 实现了 Iterable接口 才能直接遍历(如增强for) NodeList类虽然是Node 的集合 ,但没有实现 Iterable 接口 故只能用 普通循环遍历和 item() 方法遍历

  3. 抽象类 如DocumentBuilder 和 DocumentBuilderFactory 本身没有构造方法 需由其他方法返回 对象本身 如DocumentBuilderFactory的newInstance()方法
    和 DocumentBuilderFactory 的newDocumentBuilder() 方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值