RandomAccessFile und Objekte

Hallo!

Mal ne Frage. Ist es möglich, Objekte in einer Datei zu positionieren und dann zu schreiben? z.B. will ich eine ArrayList nich an den Anfang einer Datei schreiben, sondern erst nach den ersten 255 Byte der Datei.
Schreiben und Serialisieren dann mit ObjectOutputStream.

Danke
Rene

Moien

Mal ne Frage. Ist es möglich, Objekte in einer Datei zu
positionieren und dann zu schreiben?

Nicht ohne Umbauten. Aber es ist möglich. Bau einen ObjectOutputStream und lass ihn in einen ByteArrayOutputStream schreiben. Schreib deine Objekte. Flush den ObjectOutputStream. Nim das Bytearray und schreibs in die Datei (wohin auch immer).

Aber du wirst auf einige Merkwürdigkeiten zum Thema Serialisierung treffen. Wenn es sich vermeiden läst: machs nicht.

cu

Was meinst du mit Merkwürdigkeiten beim Serialisieren. Kanns passieren, dass ich die Daten dann nich mehr Deserialisieren kann?

Ich kann dir ja mal kurz mein Vorhaben erklären. Und zwar muss ich eine Art FileSystem programmieren. Das ganz auf Grundlage einer Containerdatei. Jetzt habe ich mir halt eine verkettete Liste genommen, eine ArrayList, die alles wichtige aufnimmt (Dateiname, Positionen in der Datei usw.). Und jetzt möchte ich halt die verkettete Liste mit den einzelnen ArrayList-Objekten in die Datei schreiben und zwar erst nach den ersten 512 Byte. Später soll dann eben die Liste mit den Objekten wieder rekunstruierbar sein, wenn ich die Datei erneut lade.

Vllt fällt dir ja noch was ein, was man anders machen könnte.

gruss
Rene

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Moien

Was meinst du mit Merkwürdigkeiten beim Serialisieren. Kanns
passieren, dass ich die Daten dann nich mehr Deserialisieren
kann?

Die serialierten Sachen lassen sich nur laden wenn die alten Klassen noch verfügbar sind. D.h. einmal neu compilieren und das Zeug ist unlesbar (es sei den man benutzt ClassIDs. Und selbst dann darf sich nix grundlegendes an der Klasse ändern).

Dann schreibt man nicht einzelne Objekte sondern immer komplette Graphen (deshalb werden manche kleinen einfachen Objekte verdammt gross). Ändert man nach dem schreiben des Graphen eines der Objekte im Graph und schreib dieses Objekt dann nochmal in den Stream so bekommt man den alten Stand beim lesen zurück. Sehr nervtötend. Deshalb gibts die reset-Methoden am Objectstream.

OO-Streams sind klasse wenn man komplexe Objekte über Netzwerk rumschieben muss. Aber interessant werden OO-Streams erst mit RMI. Und RMI hat nochmal ganz einigene Probleme. Zum abspeichern und später laden würde ich andere Sachen nehmen (java.beans.XMLEncoder).

Ich kann dir ja mal kurz mein Vorhaben erklären. Und zwar muss
ich eine Art FileSystem programmieren. Das ganz auf Grundlage
einer Containerdatei. Jetzt habe ich mir halt eine verkettete
Liste genommen, eine ArrayList, die alles wichtige aufnimmt
(Dateiname, Positionen in der Datei usw.). Und jetzt möchte
ich halt die verkettete Liste mit den einzelnen
ArrayList-Objekten in die Datei schreiben und zwar erst nach
den ersten 512 Byte. Später soll dann eben die Liste mit den
Objekten wieder rekunstruierbar sein, wenn ich die Datei
erneut lade.

Nimm den XML-Encoder oder das wird sehr, sehr versionsabhängig. Eine neue Variable in der Containerklasse und alle alten Dateisysteme sind futsch.

cu

Du meinst jetzt also den ganzen Kram mit den ObjectOutputStream verwerfen und dafür die verkettete Liste mit den ArrayListen über einen XML Encoder speichern und lesen?

Habe ich das jetzt richtig verstanden. Dann würde sich auch das (De)Serialisieren erledigen?

Wo kann ich über den XML Encoder Informationen herbekommen, die auch für Java Einsteigen gut geeignet sind. Google spuckt nich wirklich viel aus.

Danke

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Moien

Du meinst jetzt also den ganzen Kram mit den
ObjectOutputStream verwerfen und dafür die verkettete Liste
mit den ArrayListen über einen XML Encoder speichern und
lesen?

Genau. Das bringt deutlich weniger Probleme wenn man später die Klassen umbauen möchte.

Habe ich das jetzt richtig verstanden. Dann würde sich auch
das (De)Serialisieren erledigen?

Der XMLDecoder macht das.

Wo kann ich über den XML Encoder Informationen herbekommen,
die auch für Java Einsteigen gut geeignet sind.

Informier dich ein bisschen über beans im Allgemeinen. An sich ist der XMLEn/Decoder sehr einfach zu benutzen wenn man sich an die beans-Vorgaben hält. Und diese Vorgaben sind für jede Art von Projekt sinnvoll.

cu

Oki…danke Dir.

Da werde ich mich mal bissl in die Richtung informieren.

gruss

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Achso…eine Frage noch, die ich noch vergessen habe. Kann ich mit dem XML Zeuchs jetzt die Position in der Datei bestimmen oder muss ich jetzt auch erst wieder alle Objekte in ein ByteArrayOutputStream und dann mit dem XML Decoder wegschreiben?

Danke

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Moien

Achso…eine Frage noch, die ich noch vergessen habe. Kann
ich mit dem XML Zeuchs jetzt die Position in der Datei
bestimmen oder muss ich jetzt auch erst wieder alle Objekte in
ein ByteArrayOutputStream und dann mit dem XML Decoder
wegschreiben?

Immernoch die ByteArray-Variante. Java sieht den anderen Fall nicht wirklich vor.

Man könnte sich aber auch per java.nio und MappedByteBuffer was zusammenbauen. Ist aber nix für Anfänger.

cu