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。