Archiv verlassen und diese Seite im Standarddesign anzeigen : Java: ObjectOutputStream ??
Moin,
ich habe ein kleines Problem mit dem java.io.ObjectOutputStream unter Java.
Folgendes: Ich schreibe Objekte in eine Datei:
java.io.FileOutputStream fos = new java.io.FileOutputStream("output", false);
java.io.ObjectOutputStream oos = new java.io.ObjectOutputStream(fos);
Nun funktioniert es aber nicht, wenn ich versuche, an diese Datei Daten anzuhängen:
java.io.FileInputStream fos = new java.io.FileInputStream("output");
java.io.ObjectInputStream oos = new java.io.ObjectInputStream(fos);
Geschrieben wird mit oos.writeObject(meineklasse)
Gelesen wird mit oos.readObject()
Ich kriege für jeden Eintrag eine StreamCorruptedException. Immer, reproduzierbar.
Mache ich was falsch oder ist das ein Bug?
peschmae
29-07-2003, 15:32
hallo,
wär nett gewesen, wenn du ein mini - beispielprog, bei dem das problem auftaucht gepostet hättest ;) - egal, bei mir geht das hier:
import java.io.*;
public class OOS {
String s = "This is the object to serialize";
OOS() {
try {
System.out.println("s vor schreiben: "+s);
ObjectOutputStream oos = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream("tmp")));
oos.writeObject(s);
oos.close();
s = "";
System.out.println("s nach schreiben geleert: "+s);
ObjectInputStream ois = new ObjectInputStream(new BufferedInputStream(new FileInputStream("tmp")));
s = (String)ois.readObject();
ois.close();
System.out.println("s nach lesen: "+s);
}
catch (Exception e) { System.out.println("exception "+e); }
}
public static void main(String[] args) {
new OOS();
}
}
vielleicht hast du das oos.close() beim schreiben weggelassen und das zeugs war noch gar nicht wirklich geschrieben, als du es schon wieder lesen wolltest (sowas sinnloses :D) :confused:
Ich benutze übrigens Suns JDK 1.4.1 (nicht _02)
MfG Peschmä
peschmae
29-07-2003, 15:34
nochwas: der BufferedInputStream/OutputStream ist jeweils nicht wirklich nötig. Aber in den meisten fällen (ich habs vor langem mal ausgetestet) ist java damit um einiges (faktor 5 oder so) schneller bei io operationen
fast so schnell wie NIO (bei mir etwa noch faktor 2 unteschied oder so)
MfG Peschmä
Moin,
das was du gepostet hast, funktioniert bei mir auch. Allerdings muß ich nach dem oos.close() (sogar mit flush() vorweg), weitere Daten anhängen.
Also rufe ich nochmal den ganzen Kram auf, den FileOutputStream öffne ich mit dem append-Flag, er soll die neuen Daten anhängen. Schreiben funktioneiert ohne Probleme, nur Lesen dann nicht mehr.
Versuch in deinem Code einfach mal, einen zweiten String in die Datei zu schreiben. Vorher alles schließen, dann nochmal.
JDK hab ich auch 'ne 1.4.x Version, weiß gerade nicht welche...
anda_skoa
29-07-2003, 17:02
Vielleicht schreibt der ObjectOutputStream am Anfang etwas zustäzliches hinein. Wenn du dann zwei solche "Anfangsstellen" im Stream hast, wird er lesende Stream durcheinander gebracht.
Probier mal 1 Objekt zu speichern, dann mit append in einem neuen ObjectStream ein zweites.
Dann im Leser nach dem ersten Object einen neuen ObjectInputStream und aus dem das zweite lesen.
Ciao,
_
peschmae
29-07-2003, 19:31
@kehj: ok,
das was mich irritiert hatte war dein originalposting:
du sprichst von Anhängen, aber der Code beinhaltet FileInputStream und ObjectInputStream - ein kleiner widerspruch :)
MfG Peschmä
peschmae
29-07-2003, 19:36
@anda_skoa: ich denke auch
protected void writeStreamHeader()
The writeStreamHeader method is provided so subclasses can append or prepend their own header to the stream.
allerdings steht leider nichts über die Implementierung in ObjectOutputStream und so
MfG Peschmä
OK, um die Verwirrung komplett zu machen erläutere ich mein Problem nochmal etwas genauer.
1. Also, ich speichere Objekte einer von mir geschriebenen Klasse. Diese enthält wiederum eine Datenobjekte (HashMap, TreeSet, ...)
2. Instanzen dieser Klasse werden in einem Vektor gesammelt. Nach einer bestimmten Zeit will ich den Inhalt (die Objekte) in 'ne Datei bannen.
3. Dummerweise habe ich sehr viele dieser Instanzen, so daß ich nicht einfach alle sammeln kann. Es sind (je nach Eingabedaten) 50 000 - 100 000 Stück.
4. So, mein Ansatz war:
Nach einer Zeit t schreibe ich alle bis dahin gesammelten Objekte in 'ne Datei:
- FileOutputStream()
- ObjectOutputStream()
-> schreiben
5. Kein Problem soweit.
Jetzt vergeht wieder eine Zeitspanne t und ich muß neue Daten schreiben. Also müssen diese neuen Daten Hinten an die Datei angehängt werden:
- FileOutputStream(append)
- ObjectOutputStream()
...
So, das 2. Schreiben (also das Schreiben am Dateiende) funktioniert nicht...
peschmae
30-07-2003, 16:16
hallo,
ich hab in Core Java nachgeschaut:
ObjectOutputStream schreibt immer zuerst einen zwei-Byte code und nachher die versionsnummer
zudem sind die Objekte irgendwie nummeriert oder so...
das ganze Format ist recht ausführlich erklärt :o
kannst du nicht einfach auf das close() verzichten und z.B. nur flush() machen? Das ist die einzige Möglichkeit die ich sehe. oder musst du schon bevor du wirklich fertig bist, wieder aus der datei lesen?
MfG Peschmä
Das ist 'ne Idee.
Ich könnte 'n Ausgabestrom als static final deklarieren und zwischendurch nur flush() aufrufen...
Gute Idee!
Ich hab jetzt Teile meines Programmes umgeschrieben, um dem Effekt zu entgehen, aber ich werd's morgen mal testen...
anda_skoa
30-07-2003, 18:46
Weder static noch final sind da wirklich nötig.
Du brauchst nur immer die selbe Instanz zu verwenden.
Ciao,
_
peschmae
31-07-2003, 08:16
richtig,
afair bringt final nur bei int/double/sozeugs etwas
bei Objekten wird doch da eh nur die Referenz eingefrohren, so dass sie immer an denselben Ort zeigst. Afaik kann man dann das Objekt immer noch problemlos durch ein anderes ersetzen und so.
MfG Peschmä
Powered by vBulletin® Version 4.2.5 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.