So speichern Sie ein Array in einer Java-Eigenschaftendatei
Lesezeit: 6 Minuten
ja
Ich mache gerade eine .properties-Datei, die geladen und in ein Array umgewandelt werden muss.
Es besteht die Möglichkeit, dass jeder Eigenschaftsschlüssel zwischen 0 und 25 vorhanden ist.
Ich habe ein paar Implementierungen ausprobiert, aber ich bin nur dabei, dies sauber zu tun.
Hat jemand Ideen?
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
Wo ich die Dateinamen/Ablauf-Paare zu einem Datenobjekt zusammenbaue, als Teil eines Arrays für jedes übergeordnete Eigenschaftselement wie foo[myobject]
Die Formatierung der Eigenschaftendatei kann sich ändern, ich bin offen für Ideen.
Mir ist nicht ganz klar, was Sie tun, aber funktioniert das einfache Einfügen der Eigenschaften in eine Karte? Es erlaubt Ihnen zu tun if(foo.has('filename'))und zum Speichern/Laden (de)serialisieren Sie es einfach …
– josh.trow
10. August 2011 um 17:59 Uhr
Können Sie Klassen erstellen, die alle Eigenschaften enthalten, die Sie in der .properties-Datei verwenden könnten, oder werden einige Eigenschaften dynamisch sein?
– mellamokb
10. August 2011 um 17:59 Uhr
@mellamokb – Ich habe bereits meine Klasse, die Dateinamen + Ablaufattribute und Methoden enthält, und ich erstelle daraus neue Objekte. Schlagen Sie vor, vielleicht ein “type”-Attribut hinzuzufügen, um die “foo”s und “bar”s zu halten? … Könnte funktionieren, ich werde es hacken …
– ja
10. August 2011 um 18:05 Uhr
Ich denke, eine Datendatei (wie eine .csv) wäre einfacher. Eigenschaften sind dafür nicht wirklich ausgelegt.
– Kopf überspringen
10. August 2011 um 18:19 Uhr
Abs
Ich kann vorschlagen, Trennzeichen zu verwenden und die zu verwenden
Sie können mehrere Werte für einen Schlüssel haben, wie in Schlüssel = Wert1, Wert2, und Sie können dies in ein Array einlesen als configuration.getAsStringArray("key")
Das versuche ich zu vermeiden, da die Felder in absehbarer Zeit enthalten sein werden , ; :
– ja
10. August 2011 um 18:07 Uhr
Danke Venu K. Das ist vielleicht nicht das, was du brauchst, aber es ist das, was ich brauchte.
– Warren Reilly
21. Juli 2014 um 15:30 Uhr
Guter Vorschlag, dieser Ansatz ist sehr hilfreich, danke.
– cнŝdk
30. März 2018 um 15:52 Uhr
Definieren Sie entweder ein Trennzeichen, das kein potenzieller Wert ist, oder lernen Sie, XML zu verwenden.
Wenn Sie immer noch darauf bestehen, Eigenschaften zu verwenden, verwenden Sie eine der Methoden, die eine Liste aller Schlüssel zurückgibt. Ihr Schlüssel scheint drei Teile zu haben, eine Gruppenkennung (foo, bar), einen Index (1, 2) und dann einen Elementnamen (Dateiname, Ablauf). Holen Sie sich alle Schlüssel, zerlegen Sie sie in ihre Bestandteile. Erstellen Sie eine Liste für jeden Bezeichnertyp. Verwenden Sie beim Verarbeiten der Liste den Bezeichner, um zu bestimmen, welcher Liste hinzugefügt werden soll. Erstellen Sie Ihre gepaarten Elemente wie gesagt und fügen Sie sie einfach zur Liste hinzu! Wenn die Indexreihenfolge wichtig ist, fügen Sie diese entweder als Feld zu Ihren gepaarten Elementen hinzu oder sortieren Sie die Schlüssel vor der Verarbeitung.
Verwenden Sie XML oder gehen Sie mit dem Schmerz um
– Adriaan Köster
10. August 2011 um 18:40 Uhr
Ich habe dieses Eigenschaftsformat aufgegeben und XML verwendet. Viel sauberer. Erweiterbar für die Zukunft. Danke, dass du mich in die richtige Richtung gestoßen hast.
– ja
15. August 2011 um 13:28 Uhr
Gott, ich liebe diese Antwort, aber leider sind einige von uns durch Bürokratie und/oder „Verwaltungseinschränkungen“ eingeschränkt, die die Verwendung von .properties anstelle von .xml erfordern. Ich werde meine derzeitige Position nicht beschreiben, aber wissen Sie. (Auch Nekromantie.)
– Kohl
23. Mai 2013 um 18:28 Uhr
Ich bin nicht einverstanden. Ich verwende sowohl JSON als auch XML. Solange es keinen “echten” Standard für JSON-Schemata gibt, bevorzuge ich XML für komplexe Konfigurationen. Wenn Sie als Team an etwas arbeiten und Sie mit der darauf basierenden Wartung und Weiterentwicklung belastet sind, dann ist eine ordnungsgemäße Schemadefinition von unschätzbarem Wert. Keine Einschränkungen bedeuten eine Menge Kopfschmerzen und Diskussionen darüber, wie man Sachen macht. Oder noch schlimmer, keine Diskussion, jeder wird implementieren, was er will, was seinen Bedürfnissen entspricht, und Sie werden schnell in einer Konfigurationshölle landen. Die automatische Vervollständigung der Konfigurationsdateien von jemand anderem ist ebenfalls schön zu haben.
– Benutzer1441149
22. Februar 2015 um 9:37 Uhr
Json ist so null, verwenden Sie Yaml!
– Hans Westerbeek
11. Dezember 2017 um 15:21 Uhr
Sangeeth
Verwenden YAML Dateien für Eigenschaften, dies unterstützt Eigenschaften als Array.
Kurzer Blick auf YAML:
Als Obermenge von JSON kann es alles tun, was JSON kann + mehr
Einfach zu lesen
Lange Eigenschaften in mehrzeilige Werte
Unterstützt Kommentare
Eigenschaften als Array
YAML-Validierung
Ich habe benutzerdefiniertes Laden. Eigenschaften müssen definiert werden als:
key.0=value0
key.1=value1
...
Benutzerdefiniertes Laden:
/** 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;
}
Jack Cox
Ich empfehle dringend die Verwendung von Apache Commons (http://commons.apache.org/configuration/). Es hat die Fähigkeit, eine XML-Datei als Konfigurationsdatei zu verwenden. Die Verwendung einer XML-Struktur erleichtert die Darstellung von Arrays als Wertelisten und nicht als speziell nummerierte Eigenschaften.
bolly38
Hier ist eine andere Möglichkeit, den Mechanismus selbst zu implementieren. Hier betrachten wir, dass das Array mit 0 beginnen sollte und kein Loch zwischen den Indizes haben würde
/**
* 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()]);
}
Hier ist eine Möglichkeit zum Testen:
@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());
}
hoffe das hilft
und alle Anmerkungen sind willkommen..
14499100cookie-checkSo speichern Sie ein Array in einer Java-Eigenschaftendateiyes
Mir ist nicht ganz klar, was Sie tun, aber funktioniert das einfache Einfügen der Eigenschaften in eine Karte? Es erlaubt Ihnen zu tun
if(foo.has('filename'))
und zum Speichern/Laden (de)serialisieren Sie es einfach …– josh.trow
10. August 2011 um 17:59 Uhr
Können Sie Klassen erstellen, die alle Eigenschaften enthalten, die Sie in der .properties-Datei verwenden könnten, oder werden einige Eigenschaften dynamisch sein?
– mellamokb
10. August 2011 um 17:59 Uhr
@mellamokb – Ich habe bereits meine Klasse, die Dateinamen + Ablaufattribute und Methoden enthält, und ich erstelle daraus neue Objekte. Schlagen Sie vor, vielleicht ein “type”-Attribut hinzuzufügen, um die “foo”s und “bar”s zu halten? … Könnte funktionieren, ich werde es hacken …
– ja
10. August 2011 um 18:05 Uhr
Ich denke, eine Datendatei (wie eine .csv) wäre einfacher. Eigenschaften sind dafür nicht wirklich ausgelegt.
– Kopf überspringen
10. August 2011 um 18:19 Uhr