PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Java: Baum im Speicher halten und als Textfile speichern



peschmae
14-03-2003, 11:22
Hallo,

ich möchte einen Baum (von File - Objekten) im Speicher halten und auch als (handbearbeitbare) Textdatei speichern und wieder laden können

Was für Klassen bietet das JDK dazu? Oder wie mach ich das am einfachsten selbst? (wohl nötig, da ich ja von den File - Objekten eigentlich nur den Pfad speichern will)

MfG Peschmä

anda_skoa
14-03-2003, 12:33
Hmm, wie sieht der Baum aus?

Knoten sindn File Objekte von Directories und Blätter Objekte von Dateien?

Oder Baum im Sinne einer sortierten Datenstruktur, die alle beide enthält?

Ciao,
_

peschmae
14-03-2003, 13:02
eher ersteres

einfach eine einfache Möglichkeit, reale Dateien einem virtuellen Pendant zuzuordnen und auch virtuelle Ordner anzulegen und die realen Dateien darin zu verstauen

das ganze muss einfach möglichst einfach auszulesen und in einem Table (das natürlich zwischen Ordnern als Objekte, die man "öffnen" kann und Dateien als einfache Einträge unterscheiden können muss)

MfG Peschmä

anda_skoa
14-03-2003, 14:03
Hmm virtuelle Ordner, also für die es kein echtes Directory gibt?

Ciao,
_

peschmae
14-03-2003, 15:19
ja,

für ein Brennprogramm (in SWT, Teile davon brauche ich dann für meine Maturarbeit, in der ich SWT vorstelle (inkl native compilation mit gcj und so) und gleich ein Tutorial dafür liefere)

So Nero - artig, falls du das kennst (cdbakeoven kommt imho am nächsten dran ran)

MfG Peschmä

Boron
14-03-2003, 15:39
Irre ich mich, oder könnte da die "Serialisierung" von Klassen hilfreich sein?

Damit lassen sich meinem bescheidenen Java-Wissen nach Objekte in Dateien schreiben.

peschmae
14-03-2003, 15:47
ja, das wäre eine Möglichkeit,

aber als Linuxer möchte ich die Daten unbedingt als Textdateien speichern, das ist universeller und viel sympatischer als das nicht entzifferbare zeugs, das bei der Serialisierung entsteht

ausserdem bleibt noch die Frage, wie ich das Zeugs am besten im Speicher halte. Etwa mit geschachtelten ArrayLists!?
Oder wäre da das DefaultTreeModel (http://java.sun.com/j2se/1.4.1/docs/api/javax/swing/tree/DefaultTreeModel.html) da der geeignetere Container?

MfG Peschmä

anda_skoa
14-03-2003, 16:27
Original geschrieben von peschmae
aber als Linuxer möchte ich die Daten unbedingt als Textdateien speichern, das ist universeller und viel sympatischer als das nicht entzifferbare zeugs, das bei der Serialisierung entsteht


Du könntest über den Baum iterieren und an jedem File getAbsolutePath aufrufen und diesen String in die Datei schreiben.
Beim Lesen, dann eine Zeile nehmen und new File(zeile);

Du musst dann noch die Baumstruktur aufbauen.
Da aber alle Files durch das Schreiben direkt nach dem Directory kommen, kann man da mit einem Stack arbeiten.
Also:
File erzeugen.
wenn Dir und schon ein aktives Dir und aktives_dir.parent != dir.parent, aktives_dir auf stack, dir wird actives_dir

So in etwa.

Theoretisch können File Instanzen auch nicht existierende Files bzw Directories beschreiben, die Frage ist dann nur, ob er isDirectory() darauf ausführen kann.



ausserdem bleibt noch die Frage, wie ich das Zeugs am besten im Speicher halte. Etwa mit geschachtelten ArrayLists!?


Bei echten Files bräuchte man nur den root knoten, weil man mit listFiles() immer an seine Einträge kommt.

Allgemein geht natürlich in eine TreeMap eintragen.
Als Key den absolutePath benutzen, der soltle für jeden Eintrag ja ohnehin verschieden sein.



Oder wäre da das DefaultTreeModel (http://java.sun.com/j2se/1.4.1/docs/api/javax/swing/tree/DefaultTreeModel.html) da der geeignetere Container?


Als Container sollte man meiner Meinung nach keine GUI Struktur verwenden.
Das schränkt nur den Code auf eine JVM mit SWING in der richtigen Version ein.

Wenn das mit dem isDirectory bei Virtuellen Ordnern nicht klappt, gibts zumindest zwei Möglichkeiten:
1) eine eigene Klasse, die entweder von File ableitet, oder für echet Files ein File enthält.

2) Mit java.net.URI arbeiten und für die virtuellen Ordner eine eigenes scheme angeben.

Ciao,
_

peschmae
15-03-2003, 08:53
scheint recht komplex zu werden...

was hältst du davon:

Ich mache für die Dateien eine Klasse, die ein File hat, das auf die reale Datei verweist und zudem einen String mit dem Namen der virtuellen Datei

Eine weitere Klasse ist für virtuelle Ordner und hat zwei ArrayLists. Die eine enthält eventuelle weitere Ordner - Objekte und die andere die File-Wrapper Objekte.

Sollte gehen, oder?

Allerdings ist dann da wieder das speichern - Problem, da ich ja zu jeder Datei nicht nur ihren reellen sondern auch ihren virtuellen Pfad speichern muss und das dann jeweils möglichst praktisch in einem rutsch schreiben und auslesen können muss

MfG Peschmä

P.S. das mit der TreeMap habe ich nicht ganz verstanden, die ist doch nur eine normale aber sortierte Map, oder? Wie soll das dann gehen?

anda_skoa
15-03-2003, 11:18
Ich müsste besser verstehen, wie bei dir diese virtuellen Ordner benannt werden, etc.
Oder was du unter virtueller Datei verstehst.

Vielleicht kannst du ein kurzes Beispiel geben?

Zur TreeMap.

Wenn du File Objects hast, haben die einen AbsolutePath.
Die Sortierung dieser Pfade zu druchlaufen, ist seh ähnlich, wie ihre Position im Filesystem.
Beispiel:
/etc
/etc/a
/etc/b

/etc ist als Verzeichnis seinen beiden Dateien a und b übergeordet, würde also beim rekursiven Durchlaufen des Filesystems vorher kommen.
Wenn du die File Objects dieser drei Einträge so in einen TreeMap einträgst, dass ihr voller Pfad der Key in der Map ist, kommt beim Durchlaufen der Map auch das Object des Verzeichnisses vor den Objects der Dateien.

Ciao,
_

peschmae
15-03-2003, 14:02
also Virtuelle Ordner sind einfach die Ordner, die dann so auf die CD gebrannt werden, aber kein reales pendant haben müssen bzw in keinem Bezug dazu stehen

mit virtueller Dateiname meine ich den Namen, unter dem eine real existierende dann auf CD gebrannt werden soll

Das Ziel ist es, quasi ein komplett Virtuelles Ordner/Datei - System aufzubauen, so dass alle Ordner nicht auf der HD existieren und die Dateien evtl. anders heissen als auf der HD, dort aber existieren müssen

Ich hoffe ich habe mich verständlich ausgedrückt :D

MfG Peschmä

peschmae
19-03-2003, 11:13
habs mal mit Objekten mit ArrayLists versucht...

geht ganz gut, aber ab einer gewissen Grösse meldet die JVM speichermangel an

habe mal bei Nero geschaut, bei einer CD mit 600MB durchschnittsdateien steigt der speicherverbrauch gerade mal um 1.2 MB

MfG Peschmä

peschmae
20-03-2003, 13:32
kein Wunder, hat doch jede ArrayList eine Ausgangskapazität, die sie im Ram reserviert... :D :D

ich glaub ich setzt die mal auf 1 und machs dann mit ensureCapacity()

und falls das nicht geht versuch ichs mal mit der TreeMap...

MfG Peschmä

peschmae
24-03-2003, 17:54
das mit den ArrayLists geht jetzt, allerdings Java-mässig recht langsam

die TreeMap, die nach den Virtuellen Pfaden sortiert ist bringt nichts, da es so ewig dauert, bis alle unterordner eines Ordners gefunden sind (die dateien der Unterordner und die unterunterordner sind da immer im weg)

MfG Peschmä