Where to keep `java.util.Properties` file and how to access it? - java

I am adding email sending capability to my web app. SMTP server settings will be read from a java.util.Properties file. I wouldn't like to hardcode path to this file.
Where should I keep this file?
How should I access this file?

A good pattern to follow is to keep your static resources (like property files) under your WEB-INF/classes/ directory.
That way they can be read from the classpath and not accessed by the browser:
for example, put your settings file under WEB-INF/classes/mail-settings.properties, and use the following to read it:
InputStream is = MyClass.class.getResourceAsStream("mail-settings.properties");
Properties p = new Properties();
p.load(is);
is.close();

Keep property file in classpath location like in folder : WEB-INF/classes/mail.properties
Here property file is - mail.properties. To read this file you can use below code
import java.util.Locale;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
public class EmailPropertyReader {
private static ResourceBundle myResources;
public static String FILENAME = "mail";
static{
initialize(FILENAME);
}
public static void initialize(String propertyFile) throws MissingResourceException
{
try{
myResources = ResourceBundle.getBundle(FILENAME, Locale.getDefault());
}catch(Exception ex){
//Logger
}
}
private static String getParameter(String parmName)
{
String param = null;
try
{
param = myResources.getString(parmName) ;
}catch(Exception e){
param = null;
//Logger
}
if (param != null)
return param.trim();
else
return param;
}
}
You just create object and enter code here use method getParameter() ->
For example:
mail.properties :
EMAILID=a#a.com
then
String strEmailid=EmailPropertyReader.getParameter("EMAILID");

if you want to keep it with your code you may just as well create the Properties instance programmatically.
Properties mailProperties = new Properties();
mailProperties.setProperty("mail.transport.protocol", "smtp");
mailProperties.setProperty("mail.smtp.host", "localhost");
mailProperties.setProperty("mail.smtp.port", "587");
mailProperties.setProperty("mail.smtp.auth", "false");
javax.mail.Session.getInstance(mailProperties);
If you want to have it in a properties file anyway you can load it as a classpath resource. Have a look at getResourceAsStream in java.lang.Class. Update: see epochs answer for how to do this!

Here is a solution:
I have placed EmailSettings.properties file into WebContent\WEB-INF\classes. This code now works:
InputStream inputFile = this.getClass().getClassLoader().getResourceAsStream("EmailSettings.properties");
Properties emailConfig = new Properties();
emailConfig.load( inputFile );
.
.
.

If the settings are stage dependent ,you could set the path to the File via a vm Enviorment varibable.
-DmyPropertyFilePath=....
Also there is a good artikel about loading property files (even so it is a bit Dated) on Java World

Related

How to read application.properties file without Environment

Please can you help me to read the properties from application.properties file in Spring Boot, without autowiring the Environment and without using the Environment?
No need to use ${propname} either. I can create properties object but have to pass my properties file path. I want to get my prop file from another location.
This is a core Java feature. You don't have to use any Spring or Spring Boot features if you don't want to.
Properties properties = new Properties();
try (InputStream is = getClass().getResourceAsStream("application.properties")) {
properties.load(is);
}
JavaDoc: http://docs.oracle.com/javase/8/docs/api/java/util/Properties.html
OrangeDog solution didn't work for me. It generated NullPointerException.
I've found another solution:
ClassLoader loader = Thread.currentThread().getContextClassLoader();
Properties properties = new Properties();
try (InputStream resourceStream = loader.getResourceAsStream("application.properties")) {
properties.load(resourceStream);
} catch (IOException e) {
e.printStackTrace();
}
Try to use plain old Properties.
final Properties properties = new Properties();
properties.load(new FileInputStream("/path/config.properties"));
System.out.println(properties.getProperty("server.port"));
In case you need to use that external properties file in your configuration it can be accomplished with #PropertySource("/path/config.properties")
The following code extracts the environment value from an existing application.properties file which is located in the Deployed Resources under WEB-INF/classes :
// Define classes path from application.properties :
String environment;
InputStream inputStream;
try {
// Class path is found under WEB-INF/classes
Properties prop = new Properties();
String propFileName = "com/example/project/application.properties";
inputStream = getClass().getClassLoader().getResourceAsStream(propFileName);
// read the file
if (inputStream != null) {
prop.load(inputStream);
} else {
throw new FileNotFoundException("property file '" + propFileName + "' not found in the classpath");
}
// get the property value and print it out
environment = prop.getProperty("environment");
System.out.println("The environment is " + environment);
} catch (Exception e) {
System.out.println("Exception: " + e);
}
Here is example, running the above code with the following input from the application.properties (Text file):
# Application settings file
environment=Test
release_date=DATE
session_timeout_minutes=25
## Allowable image types
img_file_extensions="jpeg;pjpeg;jpg;png;gif"
## Images are saved with this extension
img_default_extension=jpg
# Mail Settings / Addresses
mail_debug=false
Output:
The environment is Test
To read application.properties just add this annotation to your class:
#ConfigurationProperties
public class Foo {
}
If you want to change the default file
#PropertySource("your properties path here")
public class Foo {
}
If everything else is properly set, you can the annotation #Value. Springboot will take care of loading the value from property file.
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.beans.factory.annotation.Value;
#Configuration
#PropertySource("classpath:/other.properties")
public class ClassName {
#Value("${key.name}")
private String name;
}
Adding to Vladislav Kysliy's elegant solution, below code can be directly plugged as REST API Call to get all the key/value of application.properties file in Spring Boot without knowing any key. Additionally, If you know the Key you can always use #Value annotation to find the value.
#GetMapping
#RequestMapping("/env")
public java.util.Set<Map.Entry<Object,Object>> getAppPropFileContent(){
ClassLoader loader = Thread.currentThread().getContextClassLoader();
java.util.Properties properties = new java.util.Properties();
try(InputStream resourceStream = loader.getResourceAsStream("application.properties")){
properties.load(resourceStream);
}catch(IOException e){
e.printStackTrace();
}
return properties.entrySet();
}

Use properties file to set directory where to load file

I have a java/mule application that loads a file from a directory created and displays it on the server eg localhost/file.txt
File dir = new File("C:\\folder");
dir.mkdirs();
File file1 = new File(dir, filePath);
The filepath is taking from the URL - it takes the param http.request.path eg file.txt and reads the file
Is there anyway I can move the hard coded bit of code for setting the folder to a mule/java properties file instead of hard coding it?
You can put the path in a properties file, and use the Properties class in Java, to read it.
Sample code :
Properties prop = new Properties();
InputStream input = null;
try {
input = new FileInputStream("config.properties");
prop.load(input);
}catch(IOException e){
//handle exception
}
More details--
You have to create a new property file, which is just a file with .properties extension. Let's call it sample.properties. You can put values, which will be key-value pairs there. This is how you will put values there :
dirpath = /home/dextr/Documents/docs/
fileName = puzzle.txt
You you will have to place the properties file in ROOT of the application or you will have to provide the relative path in order to read it.
Then you use a code like the following one to read the values in a properties object. Depending upon what value you need, you use the appropriate key.
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
public class SoSample {
public static void main(String[] args) {
Properties properties = new Properties();
InputStream input = null;
try {
input = new FileInputStream("sample.properties");
properties.load(input);
String dirPath = (String)properties.get("dirpath");
System.out.println(dirPath);
} catch (IOException e) {
e.printStackTrace();
}
}
}

Open a properties file from a class in a Dynamic Web Project

I'm using Eclipse for EE Developer.
I need to access to a properties file (db.properties) from a class's method (DBQuery.java).
The class is located inside a package inside the src folder.
For the properties file i tried almost everything that i could find over the net to make it work, but looks like i can't.
The properties file is located inside the WebContent folder, and i'll add the code with which i'm trying to load this file:
public class DBQuery {
public static String create_DB_string(){
//the db connection string
String connString = "";
try{
Properties props = new Properties();
FileInputStream fis = new FileInputStream("db.properties");
props.load(fis);
fis.close();
/* creating connString using props.getProperty("String"); */
}
catch (Exception e) {
System.out.println(e.getClass());
}
return connString;
}
}
So my question is, where to put the properties file, and which is the correct way to load it?
You can put this propertie file within your java package for example com/test and use following:
getClass().getResourceAsStream( "com/test/myfile.propertie");
Hope it helps.

Set up variables in a file instead of in a class JAVA

im not sure if the title is correct but currently i have :
private String destinationPDF = "D:/Documents/NetBeansProjects/printing~subversion/fileupload/web/resources/pdf/";
public static String destination ="D:/Documents/NetBeansProjects/printing~subversion/fileupload/Uploaded/";
public String fileList = "D:/Documents/NetBeansProjects/printing~subversion/fileupload/web/resources/Directory Files/directoryFiles.txt";
These are defined in the class, across 2 class actually, but this is not a perfect situation for me, i want to know is there a way to store the locations in a txt for example and access that ?
You need to use the java.util.Properties class.
See the documentation on the jdk documentation page.
Here is a sample usage:
Properties prop = new Properties();
try {
prop.load(new FileInputStream("config.properties"));
System.out.println(prop.getProperty("destinationPDF"));
System.out.println(prop.getProperty("destination"));
System.out.println(prop.getProperty("fileList"));
} catch (IOException ex) {
ex.printStackTrace();
}
And here the properties file:
# sample properties
destinationPDF=D:/Documents/NetBeansProjects/printing~subversion/fileupload/web/resources/pdf/
destination="D:/Documents/NetBeansProjects/printing~subversion/fileupload/Uploaded/
fileList =D:/Documents/NetBeansProjects/printing~subversion/fileupload/web/resources/Directory Files/directoryFiles.txt

How to read a properties file in Java? [duplicate]

This question already has answers here:
Where to place and how to read configuration resource files in servlet based application?
(6 answers)
Closed 7 years ago.
I am using servlets where I hard-code the database connection details, so if make any change I have to recompile the code. So instead I'd like to use a .properties file (which I can modify later) and use that as the source for my database connection.
The problem is I don't know how to read the property file. Could someone please help me to read the file?
. . .
// create and load default properties
Properties defaultProps = new Properties();
FileInputStream in = new FileInputStream("defaultProperties");
defaultProps.load(in);
in.close();
// create application properties with default
Properties applicationProps = new Properties(defaultProps);
// now load properties from last invocation
in = new FileInputStream("appProperties");
applicationProps.load(in);
in.close();
. . .
Example is coming from here Properties (Java)
The methods of Properties can throw exceptions.
- When the file path is not valid (FileNotFoundException). Please try to create a File object and check, whether the File is existing.
- ...
You may take a look at Apache Commons Configuration. Using it you can read properties file like that:
Configuration config = new PropertiesConfiguration("user.properties");
String connectionUrl = config.getString("connection.url");
This information regarding file location may be also important:
If you do not specify an absolute
path, the file will be searched
automatically in the following
locations:
in the current directory
in the user home directory
in the classpath
So in case of reading properties file in a servlet you should put properties file in a classpath (e.g. in WEB-INF/classes).
You can find more examples at their website.
You can use java.util.Properties
The biggest problem in reading a property file in web application is that you actually don't know about the actaul path of the file. So we have to use the relative path and for that we have to use various functions and classes like getresourceAsStream(), InputStream, FileinputStream etc.
And the method getReourceAsStream behaves differently in static and non static methogs..
you can do this in below way
Non Static
InputStream input = getClass().getClassLoader().getResourceAsStream("config.properties");
Static
InputStream input = ReadPropertyFile.class.getClassLoader().getResourceAsStream("config.properties");
For complete reference you can follow these links..
http://www.codingeek.com/java/using-getresourceasstream-in-static-method-reading-property-files
http://www.codingeek.com/java/read-and-write-properties-file-in-java-examples/
InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream("my.properties");
Properties p = new Properties();
p.load(in);
in.close();
The below code, will add a Listener which checks for file configured with dbprops system property. For every given interval it will look if the file is modified, if it is modified it will load the Properties from the file.
package com.servlets;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Timer;
import java.util.TimerTask;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class DBPropsWatcherListener
implements ServletContextListener
{
public void contextInitialized(ServletContextEvent event)
{
ServletContext servletContext = event.getServletContext();
Timer timer = new Timer("ResourceListener");
timer.schedule(new MyWatcherTask(servletContext), 15);
}
public void contextDestroyed(ServletContextEvent event)
{
}
private class MyWatcherTask extends TimerTask
{
private final ServletContext servletContext;
private long lastModifiedTime = -1;
public MyWatcherTask(ServletContext servletContext)
{
this.servletContext = servletContext;
}
public void run()
{
try {
File resourceFile = new File(System.getProperty("dbProps"));
long current = resourceFile.lastModified();
if (current > lastModifiedTime) {
java.io.InputStream dbPropsStream = new FileInputStream(resourceFile );
java.util.Properties dbProps = new java.util.Properites();
dbProps.load(dbPropsStream);
realoadDBProps();
}
lastModifiedTime = current;
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
}
}
Below program read the properties file a display using key value pair
File f1 = new File("abcd.properties");
FileReader fin = new FileReader(f1);
Properties pr = new Properties();
pr.load(fin);
Set<String> keys = pr.stringPropertyNames();
Iterator<String> it = keys.iterator();
String key, value;
while (it.hasNext())
{
key = it.next();
value = pr.getProperty(key);
System.out.println(key+":"+value);
}
}
If your application is small enough with only a handful of properties coming from just one or two property files, then I would suggest to use the JDK's own Properties class which load the properties from a file and use it just like the way you use a hashtable. Properties class itself inherits from Hashtable. But, your application is significantly large with sizable number of properties coming from different sources like property files, xml files, system properties then I would suggest to use Apache commons configuration. It presents a unified view of properties from across different configuration sources and allows you to define an override and preference mechanism for common properties appearing in different sources. Refer this article http://wilddiary.com/reading-property-file-java-using-apache-commons-configuration/ for a quick tutorial on using the commons configuration.
This may work::
Properties prop = new Properties();
FileReader fr = new FileReader(filename);
prop.load(fr);
Set<String> keys = pr.stringPropertyNames();
//now u can get the values from keys.
The Properties class has a convenient load method. That's the easiest way to read a java properties file.
That is a good idea to read the database values from properties file
You can use a properties class from Util package. The important thing to keep in mind is closing the stream after reading the file or writing the file to disk. Otherwise it causes problems. Here is an example for your reference:
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;
public class App
{
public static void main( String[] args )
{
Properties prop = new Properties();
try {
//load a properties file
prop.load(new FileInputStream("config.properties"));
//get the property value and print it out
System.out.println(prop.getProperty("database"));
System.out.println(prop.getProperty("dbuser"));
System.out.println(prop.getProperty("dbpassword"));
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
Output
localhost
mkyong
password
ResourceBundle rb = ResourceBundle.getBundle("mybundle");
String propertyValue = rb.getString("key");
assuming mybundle.properties file is in classpath
Read this.Usually the properties file is kept in the classpath so that this method can read it.

Categories