Java属性文件– java.util.Properties

时间:2020-02-23 14:36:46  来源:igfitidea点击:

Java属性文件用于存储键值对配置。
java.util.Properties类用于处理Java中的属性文件。

Java属性文件– java.util.Properties

在java中,属性文件可以是带有键值对的普通属性文件,也可以是XML文件。

在此Java属性文件示例中,我们将向您展示如何以两种格式写入属性文件,然后从两个配置文件中读取属性。

我们还将向您展示如何从类路径加载属性文件以及如何从属性文件读取所有键。

Java属性文件示例

package com.theitroad.util;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import java.util.Set;

public class PropertyFilesUtil {

	public static void main(String[] args) throws IOException {
		String propertyFileName = "DB.properties";
		String xmlFileName = "DB.xml";
		writePropertyFile(propertyFileName, xmlFileName);
		readPropertyFile(propertyFileName, xmlFileName);
		readAllKeys(propertyFileName, xmlFileName);
		readPropertyFileFromClasspath(propertyFileName);
	}

	/**
	 * read property file from classpath
	 * @param propertyFileName
	 * @throws IOException
	 */
	private static void readPropertyFileFromClasspath(String propertyFileName) throws IOException {
		Properties prop = new Properties();
		prop.load(PropertyFilesUtil.class.getClassLoader().getResourceAsStream(propertyFileName));
		System.out.println(propertyFileName +" loaded from Classpath::db.host = "+prop.getProperty("db.host"));
		System.out.println(propertyFileName +" loaded from Classpath::db.user = "+prop.getProperty("db.user"));
		System.out.println(propertyFileName +" loaded from Classpath::db.pwd = "+prop.getProperty("db.pwd"));
		System.out.println(propertyFileName +" loaded from Classpath::XYZ = "+prop.getProperty("XYZ"));
		
	}

	/**
	 * read all the keys from the given property files
	 * @param propertyFileName
	 * @param xmlFileName
	 * @throws IOException 
	 */
	private static void readAllKeys(String propertyFileName, String xmlFileName) throws IOException {
		System.out.println("Start of readAllKeys");
		Properties prop = new Properties();
		FileReader reader = new FileReader(propertyFileName);
		prop.load(reader);
		Set<Object> keys= prop.keySet();
		for(Object obj : keys){
			System.out.println(propertyFileName + ":: Key="+obj.toString()+"::value="+prop.getProperty(obj.toString()));
		}
		//loading xml file now, first clear existing properties
		prop.clear();
		InputStream is = new FileInputStream(xmlFileName);
		prop.loadFromXML(is);
		keys= prop.keySet();
		for(Object obj : keys){
			System.out.println(xmlFileName + ":: Key="+obj.toString()+"::value="+prop.getProperty(obj.toString()));
		}
		//Now free all the resources
		is.close();
		reader.close();
		System.out.println("End of readAllKeys");
	}

	/**
	 * This method reads property files from file system
	 * @param propertyFileName
	 * @param xmlFileName
	 * @throws IOException 
	 * @throws FileNotFoundException 
	 */
	private static void readPropertyFile(String propertyFileName, String xmlFileName) throws FileNotFoundException, IOException {
		System.out.println("Start of readPropertyFile");
		Properties prop = new Properties();
		FileReader reader = new FileReader(propertyFileName);
		prop.load(reader);
		System.out.println(propertyFileName +"::db.host = "+prop.getProperty("db.host"));
		System.out.println(propertyFileName +"::db.user = "+prop.getProperty("db.user"));
		System.out.println(propertyFileName +"::db.pwd = "+prop.getProperty("db.pwd"));
		System.out.println(propertyFileName +"::XYZ = "+prop.getProperty("XYZ"));
		//loading xml file now, first clear existing properties
		prop.clear();
		InputStream is = new FileInputStream(xmlFileName);
		prop.loadFromXML(is);
		System.out.println(xmlFileName +"::db.host = "+prop.getProperty("db.host"));
		System.out.println(xmlFileName +"::db.user = "+prop.getProperty("db.user"));
		System.out.println(xmlFileName +"::db.pwd = "+prop.getProperty("db.pwd"));
		System.out.println(xmlFileName +"::XYZ = "+prop.getProperty("XYZ"));
		//Now free all the resources
		is.close();
		reader.close();
		System.out.println("End of readPropertyFile");
	}
	
	/**
	 * This method writes Property files into file system in property file
	 * and xml format
	 * @param fileName
	 * @throws IOException
	 */
	private static void writePropertyFile(String propertyFileName, String xmlFileName) throws IOException {
		System.out.println("Start of writePropertyFile");
		Properties prop = new Properties();
		prop.setProperty("db.host", "localhost");
		prop.setProperty("db.user", "user");
		prop.setProperty("db.pwd", "password");
		prop.store(new FileWriter(propertyFileName), "DB Config file");
		System.out.println(propertyFileName + " written successfully");
		prop.storeToXML(new FileOutputStream(xmlFileName), "DB Config XML file");
		System.out.println(xmlFileName + " written successfully");
		System.out.println("End of writePropertyFile");
	}

}

当我们在Java属性文件示例程序上方运行时,writePropertyFile方法将以两种格式写入属性文件,并将其存储在项目根目录中。

这是通过writePropertyFile方法创建的属性文件。

DB.properties

#DB Config file
#Fri Nov 16 11:16:37 PST 2012
db.user=user
db.host=localhost
db.pwd=password

DB.xml

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE properties SYSTEM "https://java.sun.com/dtd/properties.dtd">
<properties>
<comment>DB Config XML file</comment>
<entry key="db.user">user</entry>
<entry key="db.host">localhost</entry>
<entry key="db.pwd">password</entry>
</properties>

注意属性文件中的注释,它是生成的,因为我们在编写文件时也通过了注释。
如果我们将注释传递为null,则属性文件中将没有注释。

这是上述java属性文件程序的输出:

Start of writePropertyFile
DB.properties written successfully
DB.xml written successfully
End of writePropertyFile
Start of readPropertyFile
DB.properties::db.host = localhost
DB.properties::db.user = user
DB.properties::db.pwd = password
DB.properties::XYZ = null
DB.xml::db.host = localhost
DB.xml::db.user = user
DB.xml::db.pwd = password
DB.xml::XYZ = null
End of readPropertyFile
Start of readAllKeys
DB.properties:: Key=db.user::value=user
DB.properties:: Key=db.host::value=localhost
DB.properties:: Key=db.pwd::value=password
DB.xml:: Key=db.user::value=user
DB.xml:: Key=db.host::value=localhost
DB.xml:: Key=db.pwd::value=password
End of readAllKeys
Exception in thread "main" java.lang.NullPointerException
	at java.util.Properties$LineReader.readLine(Properties.java:434)
	at java.util.Properties.load0(Properties.java:353)
	at java.util.Properties.load(Properties.java:341)
	at com.theitroad.util.PropertyFilesUtil.readPropertyFileFromClasspath(PropertyFilesUtil.java:31)
	at com.theitroad.util.PropertyFilesUtil.main(PropertyFilesUtil.java:21)

因此,当我们仅提供文件名时,它将在项目根目录中查找该文件,该目录与存储属性文件的位置相同。
但是,当我们尝试从类路径加载属性文件时,它会抛出NullPointerException,因为它试图从类路径(即项目的src目录)加载文件。

因此,如果我们将属性文件复制到classes src目录中,则可以加载它们并且运行良好。
在这种情况下,readPropertyFileFromClasspath方法的输出为:

DB.properties loaded from Classpath::db.host = localhost
DB.properties loaded from Classpath::db.user = user
DB.properties loaded from Classpath::db.pwd = password
DB.properties loaded from Classpath::XYZ = null

另外,请注意,当我们使用相同的Properties对象加载另一个属性文件时,应使用clear()方法清除其内容。
如果我们传递任何未在属性对象中存储任何值的键,则它将返回null。