Tirant les valeurs à partir d'un fichier de Propriétés Java dans l'ordre?
J'ai un fichier de propriétés où l'ordre des valeurs est importante. Je veux être en mesure de parcourir les propriétés du fichier de sortie et les valeurs en fonction de l'ordre du fichier d'origine.
Cependant, depuis le fichier de Propriétés est soutenu par, corrigez-moi si je me trompe, une Carte qui ne conserve pas l'ordre d'insertion, l'itérateur retourne les valeurs dans le mauvais ordre.
Voici le code que j'utilise
Enumeration names = propfile.propertyNames();
while (names.hasMoreElements()) {
String name = (String) names.nextElement();
//do stuff
}
Est-il de toute façon pour obtenir les Propriétés rentré dans l'ordre court de rédaction de mon propre analyseur de fichier?
Vous devez vous connecter pour publier un commentaire.
Si vous pouvez modifier les noms de propriété de votre préfixe avec un chiffre ou d'autres sortable préfixe et puis trier les Propriétés du Clavier.
Étendre
java.util.Properties
, remplacer les deuxput()
etkeys()
:return Collections.<Object>enumeration(keys);
, donc c'est suffisant:return Collections.enumeration(keys);
Properties
classe, remplacer, c'est de la méthode et de mettre la clé dans une structure de données qui enregistre l'ordre d'insertion. Cela fonctionne parce queProperties
met les clés/valeurs dans le même ordre qu'il lit à partir du fichier - top->bas.Non, les cartes sont par nature "non ordonnée".
Vous pourriez éventuellement créer votre propre sous-classe de
Properties
qui l'emportaient sur lessetProperty
et, éventuellement,put
, mais il serait probablement très spécifique à l'implémentation...Properties
est un premier exemple de mauvaise encapsulation. Lorsque j'ai écrit une version étendue (environ 10 ans!) il a fini par être hideux et certainement sensible aux détails de mise en œuvre deProperties
.Dominique Laurent de la solution ci-dessus fonctionne très bien pour moi. J'ai également ajouté la méthode suivante remplacement:
Probablement pas le plus efficace, mais il ne s'exécute une fois dans ma servlet cycle de vie.
Merci Dominique!
Configuration D'Apache Commons pourrait faire l'affaire pour vous. Je n'ai pas testé moi-même, mais j'ai vérifié leurs sources et ressemble à de la propriété touches sont appuyées par LinkedList dans AbstractFileConfiguration classe:
Dans l'intérêt de l'exhaustivité ...
Je ne pense pas que les méthodes de retour doivent être remplacées comme un ensemble, par définition, ne maintient pas l'ordre d'insertion
Ce persister l'ordre de fichier de propriété
Vous devez remplacer également keySet() si vous souhaitez exporter des Propriétés XML:
public Set<Object> keySet() {
return keys;
}
Voir https://github.com/etiennestuder/java-ordered-properties pour une mise en œuvre complète qui permet de lire/écrire des fichiers de propriétés dans un ordre précis.
Je vais ajouter un de plus célèbre YAEOOJP (Encore un Autre Exemple De l'ordre de Propriétés Java) de ce fil, car il semble que personne ne pourrait jamais moins de soins sur par défaut propriétés que vous pouvez nourrir vos propriétés.
@voir http://docs.oracle.com/javase/tutorial/essential/environment/properties.html
C'est ma classe: sûrement pas 1016% compatible avec toute les situations possibles, mais c'est très bien pour mon limitée muet fins de la droite maintenant. Aucun commentaire pour correction est apprécié de sorte que le Plus grand Bien, peuvent en bénéficier.
Dans certains réponses, il est supposé que les propriétés de lire à partir du fichier sont mis à l'instance de
Properties
(par des appels àput
) dans l'ordre où elles apparaissent-ils dans le fichier. Alors que c'est en général la façon dont il se comporte, je ne vois aucune garantie pour la commande.À mon humble avis: il est préférable de lire le fichier ligne par ligne (de sorte que l'ordre est garanti), que d'utiliser les Propriétés de la classe comme un analyseur de la seule propriété
ligne et, enfin, de le stocker dans certains Collection ordonnée comme
LinkedHashMap
.Ceci peut être réalisé comme ceci:
Il suffit de noter que la méthode posté ci-dessus prend une
InputStream
qui doit être fermé par la suite (bien sûr, il n'y a pas de problème à le réécrire pour ne prendre qu'un fichier comme argument).Comme je le vois,
Properties
est pour beaucoup lié àHashtable
. Je suggère la lecture pour unLinkedHashMap
. Pour cela, vous aurez seulement besoin de surcharger une méthode unique,Object put(Object key, Object value)
, mépris laProperties
comme une clé/valeur conteneur:Utilisation:
Une alternative est de simplement écrire votre propre fichier de propriétés à l'aide de LinkedHashMap, voici ce que j'utilise :
À utiliser :
Exemple de fichier de propriétés (dans le cas présent projet.les propriétés) :