So speichern Sie ein Array in einer Java-Eigenschaftendatei

Lesezeit: 6 Minuten

Benutzeravatar von yep
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

Benutzeravatar von Abs
Abs

Ich kann vorschlagen, Trennzeichen zu verwenden und die zu verwenden

String.split(delimiter)

Beispiel einer Eigenschaftendatei:

MON=0800#Etwas#Etwas1, Etwas2

prop.load(new FileInputStream("\\\\Myseccretnetwork\\Project\\props.properties"));
String[]values = prop.get("MON").toString().split("#");

Ich hoffe, das hilft

  • Simpel und einfach. Perfekt

    – Sairam

    26. Mai 2016 um 22:58 Uhr

  • Das Problem bei diesem Ansatz ist jedoch, dass die Daten in der Eigenschaftendatei in einer Zeile stehen sollten.

    – Ammad

    24. August 2017 um 20:58 Uhr

Habe deine Absicht nicht ganz verstanden. Überprüfen Sie die Apache Commons-Konfigurationsbibliothek http://commons.apache.org/configuration/

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

Benutzeravatar von Sangeeth
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

  1. Einfach zu lesen
  2. Lange Eigenschaften in mehrzeilige Werte
  3. Unterstützt Kommentare
  4. Eigenschaften als Array
  5. 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;
}

Benutzeravatar von Jack Cox
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.

Benutzeravatar von boly38
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..

1449910cookie-checkSo speichern Sie ein Array in einer Java-Eigenschaftendatei

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy