2016-08-04 26 views
3

Ich habe verschiedene Methoden zum Speichern und Laden von Konfigurationseinstellungen für meine Anwendung untersucht. Ich habe in Preferences, JSON, Properties und XML nachgeschaut, aber ich denke, dass ich mich für die meisten meiner Anwendungseinstellungen für die Methode Properties entschieden habe.(Java) Speichern/Laden einer ArrayList mit den Eigenschaften

Ich finde jedoch keine Informationen darüber, wie man am besten eine ArrayList aus dieser Datei speichert und lädt. Es scheint, dass nur einzelne Schlüssel/Paar-Kettenkombinationen möglich sind.

Also meine Frage ist im Grunde, gibt es einen besseren Weg, dies zu tun? Ich habe eine ArrayList von Strings in meiner Anwendung, die ich speichern und laden muss. Kann dies mit Properties getan werden oder muss ich eine separate Datei verwenden, nur um diese Liste zu halten und dann als ArrayList (pro Zeile, vielleicht) einlesen?

BEARBEITEN: Ich sollte erwähnen, ich möchte alle Konfigurationsdateien als lesbaren Text behalten, so vermeide ich Serialization.

Antwort

0

Ich fand, dass die Verwendung der folgenden Kombination in meinem Fall perfekt funktionierte.

Speicher:

String csv = String.join(",", arrayList()); 
props.setProperty("list", csv); 

Dies wird ein String enthält jedes Element der ArrayList, mit einem Komma getrennt erstellen.

Last:

arrayList = Arrays.asList(csv.split(",")); 

ist den csv String und spaltet sie an jedem Komma, um die Elemente zu der Referenz arrayList Zugabe.

+0

, die für mich nicht funktioniert, Compiler sagt: „Inkompatible Typen Pflichtarraylist aber‚asList‘abgeleitet wurde zur Liste:. Keine Instanz (en) des Typs Variable (n) T vorhanden sein, damit Liste entspricht ArrayList Gewure

+0

Sie müssen den Typ der Daten angeben, die in der 'ArrayList 'gespeichert werden. Die Fehlermeldung, die Sie erhalten sollten, sollte dies verdeutlichen. Diese Methode funktioniert auch nur bei Strings, also müssen Sie Ihre' ArrayList' definieren : 'ArrayList arrayList; ' – Zephyr

2

Sie können Kommas verwenden, um mehrere Werte auf demselben Schlüssel zu platzieren.

key:value1,value2,value3 

Dann teilen Sie sie die Split-Funktion einer Zeichenkette verwenden, nachdem sie in dem zu lesen geben Ihnen einen String[] Array, das in eine ArrayList über Arrays.asList() gedreht werden kann.

Hier ist ein Teil MCVE:

ArrayList<String> al = new ArrayList<>(); 
al.add("value1"); 
al.add("value2"); 
al.add("value3"); 

String values = al.toString(); 
//Substring used to get rid of "[" and "]" 
prop.setProperty("name",values.substring(1,values.length() - 1); 
+0

Klingt wie eine gute Lösung für mich! Vielen Dank. Denkst du, du könntest Beispielcode schreiben, wie ich das Array mit einem Delimiter in die 'Properties'-Datei schreiben würde? Ich nehme an, es wäre eine Art von Iteration durch mein Array in der 'setProperty()' Methode, richtig? – Zephyr

+0

Ich würde eigentlich nur eine repräsentative "String" erstellen, um zu bestehen. Ich werde den verifizierten Code in einer Sekunde veröffentlichen. –

+0

In der Zwischenzeit versuche ich, diese 'Zeichenfolge' als Wert zu übergeben:' String csv = String.join (",", arrayList) '. – Zephyr

0

Ich habe für das Schreiben von Listen in eine Datei Properties zwei Ansätze gesehen. Eine besteht darin, jedes Element der Liste als einen separaten Eintrag zu speichern, indem der Index dem Namen der Eigenschaft — so ähnlich wie "mylist.1", "mylist.2" hinzugefügt wird. Die andere besteht darin, einen einzelnen Wert der Elemente, getrennt durch ein Trennzeichen, zu erstellen.

Der Vorteil der ersten Methode besteht darin, dass Sie mit jedem Wert umgehen können, ohne sich darum kümmern zu müssen, was zu tun ist, wenn der Wert das Trennzeichen enthält. Der zweite Vorteil besteht darin, dass Sie die gesamte Liste abrufen können, ohne über alle Einträge in Properties zu iterieren.

In beiden Fällen möchten Sie wahrscheinlich einen Wrapper (oder suchen Sie eine Bibliothek) um das Objekt Properties erstellen, das Methoden zum Speichern und Abrufen von Listen mit dem von Ihnen gewählten Schema hinzufügt. Oft verfügen diese Wrapper über Methoden zum Überprüfen und Konvertieren anderer gängiger Datentypen wie Zahlen und URLs.