java.util.Properties class (see Java SE 7 Javadoc) by default assumes ISO 8859-1 character encoding in reading and writing. So when a properties file is in other character encoding, you will see strange characters and behaviors.
Properties class has no method or constructor that takes encoding or locale parameter. Fortunately, in Java SE 6, two new methods were added to allow for reading from java.io.Reader and writing to java.io.Writer:
So you can create Reader or Writer instances with appropriate encoding, and pass them to Properties load or list methods. For example,
public synchronized void load(Reader reader) throws IOException;
public void list(PrintWriter out)
Output from running loadPropertiesTest test:
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.Properties;
import org.junit.Test;
public class MyTest {
@Test
public void loadPropertiesTest() throws Exception {
final File jndiPropertiesFile = new File(System.getProperty("user.home"), "tmp/jndi.properties");
final FileInputStream fileInputStream = new FileInputStream(jndiPropertiesFile);
// FileReader does not have any constructor that takes encoding, so use InputStreamReader instead
final InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream, "UTF-8");
final Properties jndiProperties = new Properties();
jndiProperties.load(inputStreamReader);
//now dump the properties to verify
jndiProperties.list(System.out);
}
}
-- listing properties --
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.provider.url=jnp://localhost:1099
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces