Solution:
You can solve this problem in several ways. Here is the simpliest method to do this. Follw this below code
Code:
String propFile = "/path/to/file";
Properties props = new Properties();
/* Set some properties here */
Properties tmp = new Properties() {
@Override
public Set<Object> keySet() {
return Collections.unmodifiableSet(new TreeSet<Object>(super.keySet()));
}
};
tmp.putAll(props);
try {
FileOutputStream xmlStream = new FileOutputStream(propFile);
/* This comes out SORTED! */
tmp.storeToXML(xmlStream,"");
} catch (IOException e) {
e.printStackTrace();
}
In the second case, you can do it by producing sorted output for both store
Properties.store(OutputStream out, String comments)
and
Properties.storeToXML(OutputStream os, String comment)
Code:
Properties props = new Properties() {
@Override
public Set<Object> keySet(){
return Collections.unmodifiableSet(new TreeSet<Object>(super.keySet()));
}
@Override
public synchronized Enumeration<Object> keys() {
return Collections.enumeration(new TreeSet<Object>(super.keySet()));
}
};
props.put("B", "Should come second");
props.put("A", "Should come first");
props.storeToXML(new FileOutputStream(new File("sortedProps.xml")), null);
props.store(new FileOutputStream(new File("sortedProps.properties")), null);
The easiest hack would be to override keySet. A bit of a hack, and not guaranteed to perform in future executions:
new Properties() {
@Override Set<Object> keySet() {
return new TreeSet<Object>(super.keySet());
}
}
In another way, you could apply something like XSLT to reformat the produced XML.
Or,
Evenmore, you can sort the keys first, later loop through the items in the properties file and write them to the xml file
public static void main(String[] args){
String propFile = "/tmp/test2.xml";
Properties props = new Properties();
props.setProperty("key", "value");
props.setProperty("key1", "value1");
props.setProperty("key2", "value2");
props.setProperty("key3", "value3");
props.setProperty("key4", "value4");
try {
BufferedWriter out = new BufferedWriter(new FileWriter(propFile));
List<String> list = new ArrayList<String>();
for(Object o : props.keySet()){
list.add((String)o);
}
Collections.sort(list);
out.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
out.write("<!DOCTYPE properties SYSTEM \"http://java.sun.com/dtd/properties.dtd\">\n");
out.write("<properties>\n");
out.write("<comment/>\n");
for(String s : list){
out.write("<entry key=\"" + s + "\">" + props.getProperty(s) + "</entry>\n");
}
out.write("</properties>\n");
out.flush();
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}