views:

304

answers:

3

Hi,
look at my "file.properties":

key1= My name is
key2= ${key1} Martin !


Why when I get the value of "key2" my result is "${key1} Martin !" unlike "My name is Martin !"

=> I program in Java 6
=> I use java.util.Properties

+3  A: 

What you want to do is impossible using the Java Properties class.

Property keys and values are simply Strings. No processing happens to them, so you can't refer to another value in a value.

Thomas Owens
weird. Using ANT you can do this. What's up with Java?
Jweede
ANT has nothing to do with Java properties. My (limited) understanding of the under-the-hood stuff in ANT is that it's parsed. Java Properties files are simply text files that contain String keys and String values that can be loaded into memory.
Thomas Owens
It's been awhile since I looked at the source but I think ant uses org.apache.commons.configuration for it's property parsing. Don't quote me on that.
seth
"What's up with Java?" I think you mean what's up with java.util.Properties, and the answer is that it doesn't do property expansion, nor does it claim to.
matt b
Seems like it should. But it sounds like using the Apache Configuration like ANT would be better.
Jweede
+7  A: 

You might want look at Apache Configuration,

http://commons.apache.org/configuration/

Among many features it supports is the Variable Interpolation.

ZZ Coder
That's it !name=MartinmyKey=hi ${name} !String result = new PropertiesConfiguration("myFile.properties").getString("myKey");====> the value of "result" is "hi Martin !"
A: 

Ant files are scripts; properties files are buckets of strings.

The primary purpose of properties files is to serve as string containers for translatable text. The format strings typically used in resource bundles use an index-based system. When the string is translated, the order of the parameters can be changed in translated versions of the string without needing to change the Java code.

String what = "Hello";
String who = "Martin";
System.out.println(MessageFormat.format("{0}, {1}!", what, who));
System.out.println(MessageFormat.format("{1}, {0}!", what, who));

Output:

Hello, Martin!
Martin, Hello!

For use cases like this, it would not make sense to encapsulate the functionality in the Properties class because the strings usually need data from the application. The MessageFormat class can be used to perform the substitution.

This type of formatting should not be confused with the other formatting options as specified by Formatter:

System.out.format("%s, %s!%n", what, who);
McDowell