Java Properties File – java.util.Properties

Filed Under: Java

Java properties file are used to store key-value pair configuration. java.util.Properties class is used to work with properties file in java.

Java Properties File – java.util.Properties

properties file in java, java util properties, read java properties file, load, write, config
In java properties file can be a normal property file with key-value pairs or it can be an XML file also.

In this java properties file example, we will show you how to write a property file in both formats and then read properties from both the configuration files.

We will also show you how to load a properties file from the classpath and how to read all the keys from the properties file.

Java Properties File Example


package com.journaldev.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");
	}

}

When we run above java properties file example program, writePropertyFile method will write property files in both the format and it will be stored in the project root directory.

Here are the property files created from writePropertyFile method.

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 "http://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>

Notice the comments in the property file, it gets generated because we passed the comment also while writing the files. If we pass comment as null, there will be no comments in the property files.

Here is the output of the above java properties file program:


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.journaldev.util.PropertyFilesUtil.readPropertyFileFromClasspath(PropertyFilesUtil.java:31)
	at com.journaldev.util.PropertyFilesUtil.main(PropertyFilesUtil.java:21)

So when we just give the file name, it looks for the file in project root directory, the same place where it stores the property files. But when we try to load a property file from the classpath, it throws NullPointerException because it tries to load the file from Classpath that is src directory of the project.

So if we copy the properties file in the classes src directory, it’s able to load them and works fine.
In that case output of the readPropertyFileFromClasspath method is:


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

Also, notice that when we use the same Properties object to load another property file, we should clear its contents using clear() method. If we pass any key for which there is no value stored in the properties object, it returns null.

That’s all for properties file in java.

Comments

  1. manish says:

    how can i read property file from command line arguments in java

  2. Superman says:

    You should update the code examples to close the connections

    1. Pankaj says:

      Yes I should, I guess I got lazy. 🙂

Leave a Reply

Your email address will not be published. Required fields are marked *

close
Generic selectors
Exact matches only
Search in title
Search in content
Search in posts
Search in pages