Comment écrire java.util.Properties en XML avec des clés triées?
J'aimerais stocker un fichier de propriétés comme XML. Est-il un moyen de trier les touches lorsque vous faites cela de sorte que le fichier XML généré sera dans l'ordre alphabétique?
String propFile = "/path/to/file";
Properties props = new Properties();
/*set some properties here*/
try {
FileOutputStream xmlStream = new FileOutputStream(propFile);
/*this comes out unsorted*/
props.storeToXML(xmlStream,"");
} catch (IOException e) {
e.printStackTrace();
}
source d'informationauteur user5084
Vous devez vous connecter pour publier un commentaire.
Voici une façon rapide et sale pour le faire:
Voici les mises en garde:
sous-classe) ne remplit pas les
contrat de Propriétés.
Par exemple, si vous avez obtenu son
keySet
et essayé de supprimer un élément à partir d'elle, une exception peut être soulevée. Donc, ne laissez pas les instances de la présente sous-classe, pour s'échapper! Dans l'extrait ci-dessus, vous n'êtes jamais en passant à un autre objet, ou de la remettre à une personne qui a une confiance légitime qu'il remplit le contrat de Propriétés, de sorte qu'il est sûr.Les propriétés.storeToXML pourrait changer,
l'amenant à ignorer le jeu de clés
méthode.
Par exemple, une version future, ou OpenJDK, pourrait utiliser le
keys()
méthode deHashtable
au lieu dekeySet
. C'est l'une des raisons pour laquelle les classes doivent toujours documenter leur "auto-emploi" (en vigueur Java Article 15). Toutefois, dans ce cas, le pire qui pourrait arriver, c'est que votre sortie ne reviendra pas triées.les méthodes d'ignorer tout "par défaut"
les entrées.
Voici un moyen de produire de l'triés sortie pour stocker les deux
Properties.store(OutputStream out, String comments)
etProperties.storeToXML(OutputStream os, String comment)
:Le plus simple hack serait de remplacer le jeu de clés. Un peu un hack, et non pas une garantie de travailler dans de futures implémentations:
(Disclaimer: je n'ai pas encore testé qu'il compile.)
Sinon, vous pouvez utiliser quelque chose comme XSLT pour reformater le produit XML.
Vous pouvez trier les clés d'abord, puis la boucle à travers les éléments dans le fichier de propriétés et de les écrire dans le fichier xml.
java.util.Propriétés est basé sur la table de hachage, qui ne stocke pas ses valeurs dans l'ordre alphabétique, mais dans l'ordre de la valeur de hachage de chaque élément, c'est pourquoi vous voyez le comportement que vous.
java.util.Propriétés est une sous-classe de java.util.Hashtable. ('Hash', la clé ici.)Vous devez venir avec votre propre client de mise en œuvre basé sur quelque chose qui garde/définit l'ordre...comme un TreeMap.
Vous pouvez mettre en œuvre votre
LinkedProperties
qui est trié au lieu d'utiliser leProperties
de Java.L'exemple de code source:
Dans mes tests, les autres réponses à cette question ne fonctionnent pas correctement sur AIX. Ma machine de test est en cours d'exécution cette version:
Après en regardant à travers la mise en œuvre de la
store
méthode, j'ai trouvé qu'il s'appuie sur l'entrySet
. Cette méthode fonctionne bien pour moi.Vous pouvez essayer ceci:
Une nouvelle classe qui fait quoi java.util.XMLUtils n'mais dans la méthode save changer cela:
à
Étendre les propriétés et remplacer les Propriétés de la classe storeToXML méthode à appeler votre nouvelle classe de la méthode de sauvegarde.
Voici une autre solution:
Pourquoi voulez-vous que le fichier XML afin d'être triés en premier lieu? Sans doute, il y a un autre morceau de code qui lit le fichier et met les données dans un autre Propriétés de l'objet. Voulez-vous faire de ce que vous pouvez trouver manuellement et modifier les entrées dans le fichier XML?