Java Liste auslagern

Tockra

Lt. Commander
Registriert
Dez. 2008
Beiträge
1.063
Hallo Leute,

ich würde gerne wissen, ob es eine Möglichkeit gäbe eine ArrayList in einer Datei zu speichern, so dass ich dieses ArrayList Objekt wieder in Java einlesen kann und weiterverwenden kann, nachdem das Programm neugestartet wurde?
Wie speicher ich sowas am besten ab ? Mit einer Möglichkeit das Objekt in einer Datei zu speichern, mit einer MYSQL oder SQL Tabelle oder wie sonst?
Wäre es übrigens auch Möglich eine Datei innerhalb der .jar Datei zu erstellen, in der man dann die Arraylist speichert?

Gruß
Tim
 
Du könntest es als serialisiertes XML ablegen & wieder auslesen.
Vorrausgesetzt die Objekte in der ArrayList implementieren Serializable.

Oder wenn deine Objekte in der ArrayList recht simpel sind, dann kannst ja auch einfach selbst das Dateiformat bestimmen o.o
Stichwort Stringkonvertierung bzw. Zerstückelung. Ist dann halt schmutzig.
 
Hi tockra, serialisierung dürfte dein Problem lösen, dazu müssen allerdings alle in deiner ArrayList gespeicherten Objekte serialisierbar sein, das heißt das Interface Serializable implementieren.

Speichern kannst du deine ArrayList dann folgendermaßen:

FileOutputStream file = new FileOutputStream( filename );
ObjectOutputStream o = new ObjectOutputStream( file );
o.writeObject (myArrayList);
o.close();

Lesen müsste so gehen:

FileInputStream file = new FileInputStream( filename );
ObjectInputStream o = new ObjectInputStream( file );
ArrayList myArrayList = (ArrayList) o.readObject();
o.close();

viel Glück
 
Wie kann ich die Datei dann innerhalb der .jar auslagern, oder geht das nicht?


PS: Habe dazu noch eine andere Frage, wie hieß nochmal das String Objekt (StringBuffer oder so?), bei dem der String immer auf das selbe Objekt verweist?
Ich meine das so:
Code:
"Tim"=="Tim" -> //false weil das erste "Tim" ein Verweis auf ein String Objekt erzeugt und das zweite "Tim" ein Verweis auf ein anderes String Objekt erzeugt.

new Ob("Tim")==new Ob("Tim") -> Das soll eben true werden. Ich meine da gab es eine Klasse, habe aber den Namen vergessen :(
 
Mit der .jar weiß ich nicht, ob das überhaupt geht.

Strings vergleicht man mit

Code:
"String".equals("String")


Willst du Strings vergleichen oder immer den gleichen Speicherplatz nutzen?
 
Tockra schrieb:
PS: Habe dazu noch eine andere Frage, wie hieß nochmal das String Objekt (StringBuffer oder so?), bei dem der String immer auf das selbe Objekt verweist?
Ich meine das so:
Code:
"Tim"=="Tim" -> //false weil das erste "Tim" ein Verweis auf ein String Objekt erzeugt und das zweite "Tim" ein Verweis auf ein anderes String Objekt erzeugt.

new Ob("Tim")==new Ob("Tim") -> Das soll eben true werden. Ich meine da gab es eine Klasse, habe aber den Namen vergessen :(

Ich würde dir generell, wenn es um Java-Programmieren geht, google sehr ans Herz legen.
http://www.google.de/search?q=java+string+vergleich

Der erste Treffer liegert unter anderem:
Daher merken Sie sich folgenden Satz gut: primitive Datentypen und Referenzen werden mit ==, Objekte mit equals verglichen!
 
Tockra schrieb:
ich würde gerne wissen, ob es eine Möglichkeit gäbe eine ArrayList in einer Datei zu speichern, so dass ich dieses ArrayList Objekt wieder in Java einlesen kann und weiterverwenden kann, nachdem das Programm neugestartet wurde?

Möglichkeiten gibt es viele. Die Standard-Serialisierung via ObjectOutputStream bzw. XmlEncoder wurden bereits genannt. Es gibt aber auch diverse 3rd Party Libraries, die sich diesem Thema widmen.

Tockra schrieb:
Wie speicher ich sowas am besten ab? Mit einer Möglichkeit das Objekt in einer Datei zu speichern, mit einer MYSQL oder SQL Tabelle oder wie sonst?

Das kommt auf den Anwendungsfall an. Extra dafür eine Datenbank zu verwenden, ist vermutlich Overkill. Aber wenn die Anwendung ohnehin bereits eine Datenbank benutzt, bietet es sich vielleicht an. Je nach Anwendung kann man auch über ausgewachsene Persistance-Lösungen wie Hibernate nachdenken.

Tockra schrieb:
Wäre es übrigens auch Möglich eine Datei innerhalb der .jar Datei zu erstellen, in der man dann die Arraylist speichert?

Auch das ist möglich, aber vermutlich selten bis niemals eine gute Idee und nicht unproblematisch in der Umsetzung (File-Locking).
Ergänzung ()

Tockra schrieb:
PS: Habe dazu noch eine andere Frage, wie hieß nochmal das String Objekt (StringBuffer oder so?), bei dem der String immer auf das selbe Objekt verweist?
Ich meine das so:
Code:
"Tim"=="Tim" -> //false weil das erste "Tim" ein Verweis auf ein String Objekt erzeugt und das zweite "Tim" ein Verweis auf ein anderes String Objekt erzeugt.

new Ob("Tim")==new Ob("Tim") -> Das soll eben true werden. Ich meine da gab es eine Klasse, habe aber den Namen vergessen :(

Es gibt Funktionen dafür. Für Strings speziell:

Code:
"Tim".intern() == "Tim".intern()

Ansonsten java.lang.System#identityHashCode()

Aber equals() ist in den meisten Fällen die richtige Lösung.
 
Danke für die Zahlreichen Antworten. Mir ist übrigens bewusst, dass ich zum Vergleich von String's equals benutzen muss, deswegen habe ich ja nach einer Klasse gefragt, bei der das nicht so ist.

Es geht nur darum, dass das afaik nicht funktionieren kann:

Code:
ArrayList<String> a = new ArrayList()...;
a.add("Test");
a.remove("Test"); // hier ist das zu löschende "Test" afaik nicht das Objekt was in der Liste ist.
 
Doch das geht, da die ArrayList-Implementierung equals() verwendet, um das passende Objekt zu finden, das entfernt werden soll und "Test".equals("Test") ist true.
 
Du lässt das Objekt das Interface Serializable implementieren oder du schreibst dir selbst eine Methode zum schreiben und lesen.
 
Ableiten geht nicht?

Ansonsten eben die Objektdaten selbst wegschreiben. Notfalls mittels Reflection die Felder auslesen.
 
Zurück
Oben