Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Ich habe eine Klasse gebaut die verschiedene Daten speichert, das klappt auch alles super. Nun habe ich mir überlegt ein zweites Object der Klasse, natürlich mit anderen Daten, zu speichern. Das klappt auch alles, mein Code dafür ist:
Java:
public void ObjektSpeichern(Object obj)
{
try
{
FileOutputStream fs = new FileOutputStream("daten.ser");
ObjectOutputStream os = new ObjectOutputStream(fs);
os.writeObject(obj);
os.close();
} catch (Exception e)
{
e.printStackTrace();
}
}
in der Datei werden die Daten richtig gespeichert. Der Aufruf sieht wie folgt aus:
ea = klasse zum lesen und speichern
ea.ObjektSpeichern(object1);
ea.ObjektSpeichern(object2);
jetzt will ich die beiden Objekte zurück lesen und nutze dafür folgende Funktion:
Java:
public Object[] ObjektLesen()
{
Object[] obj = new Object[1];
try
{
FileInputStream fs = new FileInputStream("daten.ser");
ObjectInputStream is = new ObjectInputStream(fs);
obj[0] = is.readObject();
obj[1] = is.readObject();
is.close();
} catch (Exception e)
{
e.printStackTrace();
}
return obj;
}
nach der Übergabe caste ich die beiden Objekte dann entsprechend zurück. Das hat alles noch gut geklappt als ich nur ein Objekt gespeichert habe, aber jetzt mit 2 Objekten bekommen ich immer eine Exception. Ich hoffe mein Problem halbwegs vernünftig dargestellt zu haben, und würde mich über jede hilfe freuen.
jetzt will ich die beiden Objekte zurück lesen und nutze dafür folgende Funktion:
Java:
public Object[] ObjektLesen()
{
Object[] obj = new Object[1];
try
{
FileInputStream fs = new FileInputStream("daten.ser");
ObjectInputStream is = new ObjectInputStream(fs);
obj[0] = is.readObject();
obj[1] = is.readObject();
is.close();
} catch (Exception e)
{
e.printStackTrace();
}
return obj;
}
nach der Übergabe caste ich die beiden Objekte dann entsprechend zurück. Das hat alles noch gut geklappt als ich nur ein Objekt gespeichert habe, aber jetzt mit 2 Objekten bekommen ich immer eine Exception.
java.io.EOFException
at java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:2553)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1296)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:350)
at jhBuch.EA.ObjektLesen(EA.java:31)
at jhBuch.JHBuch.main(JHBuch.java:189)
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
at jhBuch.JHBuch.main(JHBuch.java:191)
Danke für den Tip mit der Arraygröße aber da bei 0 angefangen wird, sind ja 2 Objekte vorhanden. Habs aber ausprobiert: :toll:
Meine Überlegung ist vielleicht die beiden Objekte irgendwie mit einem Zeichen zu trennen damit das einlesen besser funktioniert, ähnlich wie beim parsen von Textdateien. Aber das macht doch eigentlich keinen Sinn oder habe ich da einen großen Denkfehler? Danke nochmal!
Ja du kannst aber nicht 2 mal aus der selben Datei Objekte einlesen ohne den Filestream zu resetten. Die Objekte müssen in unterschiedliche Dateien. Was da geworfen wird ist eine End of File-Exception, sprich der lese stream ist am Ende der Datei angekommen.
Danke dir, hatte sowas schon befürchtet. Ich wollte irgendwie umgehen mehr als 1Datei zum Speichern zu verwenden. Ich fand das irgendwie ineffektiv :noe: aber gut wenn es einen Fehler wirft werde ich mich beugen. Nach dem Boxen werde ich es direkt ausprobieren. Trotzdem schon mal danke, sobald es läuft Schließ ich dann den thread.
Ps: sehr beeindruckend wie das Forum um diese Zeit noch fachlich und super schnell reagiert daher danke noch mal an alle.
java.io.EOFException
at java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:2553)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1296)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:350)
at jhBuch.EA.ObjektLesen(EA.java:31)
at jhBuch.JHBuch.main(JHBuch.java:189)
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
at jhBuch.JHBuch.main(JHBuch.java:191)
Danke für den Tip mit der Arraygröße aber da bei 0 angefangen wird, sind ja 2 Objekte vorhanden. Habs aber ausprobiert: :toll:
Meine Überlegung ist vielleicht die beiden Objekte irgendwie mit einem Zeichen zu trennen damit das einlesen besser funktioniert, ähnlich wie beim parsen von Textdateien. Aber das macht doch eigentlich keinen Sinn oder habe ich da einen großen Denkfehler? Danke nochmal!
Da steht ArrayIndexOutOfBounds 1, das heißt bei einem Array mit der Größe 1 gibt es nur den Index 0, sobald du auf 1 zugreifen willst bekommst du die Exception. Das ist aber nur eins deiner Probleme.
Das 2. ist dass du anscheinend nur ein Objekt geschrieben hast. Wenn du
Java:
public void ObjektSpeichern(Object obj)
Mehrmals aufrufst wird der Inhalt immer überschrieben und somit steht nur ein Objekt in der Datei. Schreib mal statt:
Java:
FileOutputStream fs = new FileOutputStream("daten.ser");
mal das hier:
Java:
FileOutputStream fs = new FileOutputStream("daten.ser", true);
Mit dem 2. Parameter sagst du dass du Daten anhängen willst statt immer wieder die Datei neu zu schreiben.
@Dekker man kann schon 2 Objekte aus einem Stream lesen
Java:
public class ObjectStreamTest
{
public static void main(String[] args) throws Exception
{
ByteArrayOutputStream bout = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(bout);
out.writeObject("Hallo");
out.writeObject("Welt");
out.close();
byte[] byteArray = bout.toByteArray();
ByteArrayInputStream bin = new ByteArrayInputStream(byteArray);
ObjectInputStream oin = new ObjectInputStream(bin);
System.out.println(oin.readObject());
System.out.println(oin.readObject());
}
}
Danke Dir für deine Hilfe! Deine Tipps waren neben den anderen sehr hilfreich. Ich hoffe ich bekomme die ganze Sache jetzt hin. Da es schon spät ist, werde ich erst morgen weiter machen. Ich werde aber bestimmt die Lösung(die ich dann hinbekommen habe) hier am Ende posten, falls gewünscht. Ich danke allen nochmal für den späten Einsatz.
LG
Tkay
Ps. Das heißt nicht das nicht vielleicht doch noch eine Frage kommt
So habe nun eine Lösung gefunden. Ich über gebe einfach bei beiden Funktionen jeweils einen Dateinamen, speicher die Daten also doch in 2 Dateien. Ist zwar nich exact das was ich wollte, aber strenggenommen eigentlich sogar richtig im Sinne der Datentrennung.