Aquí está una manera rápida y sucia para hacerlo:
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();
}
Estas son las advertencias:
- Las Propiedades TMP (un subclase anónima) no cumple con el contrato de Propiedades .
Por ejemplo, si obtuvo keySet
y trató de eliminar un elemento, se generará una excepción. Por lo tanto, no permita que las instancias de esta subclase escapen! En el fragmento anterior, nunca lo pasa a otro objeto ni lo devuelve a un llamante que tiene una expectativa legítima de que cumple el contrato de Propiedades, por lo que es seguro.
- La implementación de Propiedades.storeToXML podría cambiar, haciendo que ignore el método keySet .
Por ejemplo, una versión futura, o OpenJDK, podría usar el método de Hashtable
en lugar de keySet
keys()
. Esta es una de las razones por las cuales las clases siempre deben documentar su "auto-uso" (Artículo efectivo de Java 15). Sin embargo, en este caso, lo peor que sucedería es que su salida revertiría a no ordenada.
- Recuerde que las propiedades de almacenamiento métodos ignoran los "por defecto" entradas.
Solo para su información, esto funciona bien con el método "storeToXML", pero no tiene ningún efecto sobre el método "store" anterior (Java 1.6). – Vincent
Muy agradable. Eso es exactamente lo que estaba buscando. Y es mucho más elegante que lo que quería hacer ...;) – brimborium
@Vincent si quiere tener ordenadas las llamadas 'store', necesita anular' keys() 'en vez de' keySet() 'para que necesite seguir la respuesta de @Espen para eso. –