2009-09-25 9 views
1

le titre dit vraiment tout. J'ai un fichier de propriétés qui a beaucoup de propriétés différentes pour différentes choses:Comment accéder à une section d'un fichier de propriétés?

ui.datasource.st.name=MyTest 
ui.datasource.st.port=111 
ui.datasource.st.ip=1.1.1.1 
ui.outputtype.snapshot=Snapshot 
ui.outputtype.spreadsheet=Spreadsheet - xls 

Le fichier est beaucoup plus grand que cela un je veux passer à la section ui.outputtype sans boucle à travers le fichier et la vérification la valeur clé.

Existe-t-il un moyen de le faire?

Vive Nathan

+0

Si vous avez les propriétés fichier chargé en tant que chaîne, pourriez-vous utiliser une regex? Ou est-ce que je manque quelque chose? – serg10

+0

Vous ne spécifiez pas comment vous analysez le fichier, utilisez-vous Properties.load() ou l'analysez-vous vous-même? –

+0

vous n'êtes pas l'analyse du fichier de propriétés vous-même êtes-vous? – Kip

Répondre

0

n °

Mmm, je dois au moins 15 caractères pour poster ... Alors Développons la réponse.

Je ne vois pas le problème. Java n'a aucun moyen magique de deviner où sont vos informations. Et à moins que le fichier pèse plusieurs mégaoctets, le charger entier (comme le fait Propriétés, ou je pense), et peut-être éliminer les données dont vous n'avez pas besoin (de la table de hachage générée), ne devrait pas prendre beaucoup de temps. Au pire, si la mémoire est un problème, l'analyser manuellement ligne par ligne, ne devrait pas être difficile et devrait être encore assez rapide.

Si la mémoire n'est pas le problème, boucler avec l'énumération fournie par propertyNames() et vérifier que les clés startWith() la chaîne donnée ne devrait pas prendre beaucoup de temps non plus.

4

Vous devez charger les propriétés, et vous pouvez obtenir la valeur par sa clé:

Properties props = new Properties(); 
props.load(new FileInputStream("my.properties")); 

props.getProperty("ui.outputtype.snapshot"); 
2

Comme il n'y a pas de concept d'une section dans la classe Properties, on aurait pu trouver un moyen de trouver la section du fichier de propriétés qui est voulu.

Une approche possible serait d'obtenir le Set de clés, et de trouver ceux qui contient le préfixe qui est désiré. Cela ressemblerait à l'application d'un filtre sur les clés de la propriété et à la sélection des clés souhaitées. Dans ce cas, nous pouvons penser au préfixe comme étant l'entrée séparée par des points dans le fichier de propriétés.

Voici un petit code exemple pour démontrer l'idée générale: (. Le code est pas très agréable car Properies est pas genericized)

Properties p = new Properties(); 
p.put("hello.world", "42"); 
p.put("hello.earth", "1"); 
p.put("abc.def", "3"); 
p.put("def.ghi", "5"); 

// Go through the keys in the property. 
for (Object propKey : p.keySet()) { 
    String key = (String)propKey; 

    // Select the keys with the prefix "hello." 
    if (key.startsWith("hello.")) { 
    System.out.println(key + ", " + p.getProperty(key)); 
    } 
} 

Sortie:

hello.world, 42 
hello.earth, 1 

En l'exemple ci-dessus, l'un n'a pas chargé les entrées du fichier de propriétés externe, mais cela peut être réalisé trivialement en utilisant le Properties.load méthode, comme mentionné précédemment dans les autres réponses.


Un peu d'une approche différente, où les clés sont filtrés par le préfixe souhaité, les informations peuvent être lues par une boucle for simple.

Voici un exemple en utilisant la méthode Collections2.filter du Google Collections, qui peut filtrer un Collection par un certain Predicate. Le résultat filtré (touches qui ont le préfixe souhaité) est donnée à la boucle for afin d'obtenir la paire de clés et de la valeur:

Properties p = new Properties(); 
p.put("hello.world", "42"); 
p.put("hello.earth", "1"); 
p.put("abc.def", "3"); 
p.put("def.ghi", "5"); 

for (Object propKey : Collections2.filter(p.keySet(), new Predicate<Object>() { 
    public boolean apply(Object o) { 
    return ((String)o).startsWith("hello."); 
    } 
})) 
{ 
    String key = (String) propKey; 
    System.out.println(key + ", " + p.getProperty(key)); 
} 

Cela peut être un surpuissant petit peu, mais il est une autre approche de la mise en œuvre d'un filtre pour affiner les propriétés avec les touches souhaitées.

0

Ceci est une exigence étrange. Si vous êtes préoccupé par les performances, faites-le avant lorsque vous ne les empaquetez pas à l'exécution.

Un simple:

cat settings.properties | grep ui.outputtype > mysmaller.properties 

devrait suffire!

1

désolé de ne pas tomber plus tôt - je n'avais pas réalisé il y avait des commentaires/réponses ici.

Fondamentalement, j'ai des «sections» dans mon fichier de propriétés qui a été développé par un collègue, je pensais à un fichier par «section». Quoi qu'il en soit, ma compréhension de la façon dont tout cela fonctionne est de plus en plus niocely et colution je suis venu avec était:

for(String key : props.stringPropertyNames()) 
    { 
     // Jump to the relevant section of a properties file 
     if(key.contains("datamode")) 
     { 
      OptionItem oi = new OptionItem(key, props.getProperty(key)); 
      // String value = props.getProperty(key); 
      this.cbo_mode.add(oi); 
     } 
    } 

Merci pour votre aide et des conseils. Nathan

2

Vous pouvez remplacer la classe Java Propriétés pour obtenir la section de manipulation dans les propriétés fichier:

@Override 
public synchronized Object put(Object key, Object value) { 
    String sKey = key.toString(); 
    if (sKey.startsWith("[") && sKey.endsWith("]")) 

Exemple complet est ici: http://devsite.pl/blog.2011-06-25.java_ini_sections.html

Questions connexes