Je suis en train de créer un fichier .properties qui doit être chargé et transformé en tableau. Mais il est possible qu’il existe entre 0 et 25 de chacune des clés de propriété. J'ai essayé quelques implémentations mais je suis juste coincé à le faire proprement. Quelqu'un a des idées?
foo.1.filename=foo.txt
foo.1.expire=200
foo.2.filename=foo2.txt
foo.2.expire=10
etc more foo's
bar.1.filename=bar.txt
bar.1.expire=100
où je vais assembler les paires nom de fichier/expire dans un objet de données, dans le cadre d'un tableau pour chaque élément de propriété parent tel que foo[myobject]
Le formatage du fichier de propriétés peut changer, je suis ouvert aux idées.
Définissez un délimiteur qui ne sera pas une valeur potentielle ou apprenez à utiliser XML.
Si vous persistez à utiliser les propriétés, utilisez l’une des méthodes permettant de renvoyer une liste de toutes les clés. Votre clé semble comporter trois parties: un identificateur de groupe (foo, bar), un index (1, 2), puis un nom d'élément (nom de fichier, expiration). Obtenez toutes les clés les briser en leurs composants. Créez une liste pour chaque type d'identifiant. Lors du traitement de la liste, utilisez l'identifiant pour déterminer la liste à ajouter. Créez vos éléments appariés comme vous l'avez dit et ajoutez-les simplement à la liste! Si l'ordre de l'index est important, ajoutez-le sous forme de champ à vos éléments couplés ou triez les clés avant le traitement.
Vous n’avez pas exactement compris votre intention ... Vérifiez la bibliothèque de configuration d’Apache Commons http://commons.Apache.org/configuration/
Vous pouvez avoir plusieurs valeurs contre une clé comme dans Key = valeur1, valeur2 .__ et vous pouvez le lire dans un tableau sous la forme configuration.getAsStringArray("key")
.
Je recommande fortement d'utiliser Apache Commons (http://commons.Apache.org/configuration/). Il peut utiliser un fichier XML en tant que fichier de configuration. L'utilisation d'une structure XML facilite la représentation des tableaux sous forme de listes de valeurs plutôt que de propriétés numérotées.
J'ai un chargement personnalisé. Les propriétés doivent être définies comme suit:
key.0=value0
key.1=value1
...
Chargement personnalisé:
/** Return array from properties file. Array must be defined as "key.0=value0", "key.1=value1", ... */
public List<String> getSystemStringProperties(String key) {
// result list
List<String> result = new LinkedList<>();
// defining variable for assignment in loop condition part
String value;
// next value loading defined in condition part
for(int i = 0; (value = YOUR_PROPERTY_OBJECT.getProperty(key + "." + i)) != null; i++) {
result.add(value);
}
// return
return result;
}
Utilisez les fichiers YAML pour les propriétés, cela prend en charge les propriétés en tant que tableau
Coup d'œil rapide sur YAML:
Un sur-ensemble de JSON, il peut faire tout ce que JSON peut + +
voici une autre façon de le faire en implémentant vous-même le mécanisme
/**
* get a string property's value
* @param propKey property key
* @param defaultValue default value if the property is not found
* @return value
*/
public static String getSystemStringProperty(String propKey,
String defaultValue) {
String strProp = System.getProperty(propKey);
if (strProp == null) {
strProp = defaultValue;
}
return strProp;
}
/**
* internal recursive method to get string properties (array)
* @param curResult current result
* @param paramName property key prefix
* @param i current indice
* @return array of property's values
*/
private static List<String> getSystemStringProperties(List<String> curResult, String paramName, int i) {
String paramIValue = getSystemStringProperty(paramName + "." + String.valueOf(i), null);
if (paramIValue == null) {
return curResult;
}
curResult.add(paramIValue);
return getSystemStringProperties(curResult, paramName, i+1);
}
/**
* get the values from a property key prefix
* @param paramName property key prefix
* @return string array of values
*/
public static String[] getSystemStringProperties(
String paramName) {
List<String> stringProperties = getSystemStringProperties(new ArrayList<String>(), paramName, 0);
return stringProperties.toArray(new String[stringProperties.size()]);
}
Voici un moyen de tester:
@Test
public void should_be_able_to_get_array_of_properties() {
System.setProperty("my.parameter.0", "ooO");
System.setProperty("my.parameter.1", "oO");
System.setProperty("my.parameter.2", "boo");
// WHEN
String[] pluginParams = PropertiesHelper.getSystemStringProperties("my.parameter");
// THEN
assertThat(pluginParams).isNotNull();
assertThat(pluginParams).containsExactly("ooO","oO","boo");
System.out.println(pluginParams[0].toString());
}
j'espère que cela t'aides
et toutes les remarques sont les bienvenues ..
Comme l'utilisateur 'Skip Head' l'a déjà souligné, le format CSV ou tout autre fichier de tableau constituerait un meilleur ajustement dans votre cas.
Si c'est une option pour vous, peut-être que cette Table implémentation pourrait vous intéresser.