Ulfmann Geschrieben 8. Juli 2009 Geschrieben 8. Juli 2009 (bearbeitet) Hallo Leute, ich steck mal wieder fest und kann keine Lösung zu meinem Fehler finden. Vorgang: Ich erzeuge mir einen Vektor, wo Objekte vom Typ Date reinsollen. Dafür wird die Methode getAllDates() aufgerufen, die mir einen Vektor zurück gibt. Fehlermeldung: java.io.StreamCorruptedException: invalid type code: AC at java.io.ObjectInputStream.readObject0(Unknown Source) at java.io.ObjectInputStream.readObject(Unknown Source) at EventHandler.getAllDates(EventHandler.java:137) at CalendarStart.main(CalendarStart.java:11) Methodenaufruf: Vector<Date> vector = new Vector<Date>(handler.getAllDates()); Methode: public Vector<Date> getAllDates() { Vector<Date> dates = new Vector<Date>(); try { FileInputStream fileInput = new FileInputStream("Dates.ser"); ObjectInputStream objectInput = new ObjectInputStream(fileInput); while(fileInput.available() > 0) { dates.addElement((Date) objectInput.readObject()); } objectInput.close(); } catch (ClassNotFoundException ex) { ex.printStackTrace(); } catch (IOException ioe) { ioe.printStackTrace(); } return dates; } Kann wer helfen? Danke im Voraus! Edit: Achso und um das in den Kontext einzubetten: Ich bau mir ein Terminverwaltungstool, dass Objekte vom Typ Date serialisiert und beim speichern in eine Datei (hier "Dates.ser") reinschreibt. Und die wiederum hätte ich gern komplett ausgelesen und in dem Vector gespeichert. So is mein Plan. Bearbeitet 8. Juli 2009 von Ulfmann Zitieren
LadyPreis Geschrieben 8. Juli 2009 Geschrieben 8. Juli 2009 Kann dein Problem nicht nachvollziehen. Wenn ich deinen Code kopiere funktioniert er bei mir ohne Probleme. Wie hast du die Datei denn erzeugt, bzw wie hast du Daten da rein bekommen? Zitieren
Ulfmann Geschrieben 8. Juli 2009 Autor Geschrieben 8. Juli 2009 (bearbeitet) Keine Exceptions bei dir?!? Das Problem trat beim 2. Aufruf von (Date) objectInput.readObject() auf. Ich hab auch probiert, die Schleife wegzulassen und manuell mehrere dieser Anweisungen nacheinander auszuführen - gleiches Resulat. Gespeichert hab ich die Datei so: try { FileOutputStream fops = new FileOutputStream("Dates.ser"); ObjectOutputStream oos = new ObjectOutputStream (fops); oos.writeObject(*das was da rein sollte*); oos.close(); } catch (IOException ex) { System.err.println(ex.toString()); } ... wobei ich für FileOutputStream den anderen überladenen Konstruktor mit nem boolean Parameter benutzt hab, da ich ja wollte, dass er neuen Inhalt hinten dran hängt. Ich hab mich jetzt dafür entscheiden, alle Date Objekte (und jedes neu angelegte) in einen Vektor zu schaufeln und diesen einfach in die Datei zu speichern. Das Auslesen des Vectors und die Verwendung des Inhalts ist dann trivial. Zur Vollständigkeit hier meine Lösung (für kosmetische Verbesserungsvorschläge bin ich immer dankbar) private Vector<Date> dates = new Vector<Date>(getDates()); public Vector<Date> getDates() //Daten aus der Datei lesen und zurück geben { try { FileInputStream fileInput = new FileInputStream("Dates.ser"); ObjectInputStream objectInput = new ObjectInputStream(fileInput); dates = (Vector) objectInput.readObject(); objectInput.close(); } catch (ClassNotFoundException clenfe) { System.err.println(clenfe.toString()); } catch (IOException ioe) { System.err.println(ioe.toString()); } return dates; } public void setDates() //Datei neu anlegen und den Vektor reinschreiben { try { FileOutputStream fops = new FileOutputStream("Dates.ser"); ObjectOutputStream oos = new ObjectOutputStream (fops); oos.writeObject(dates); oos.close(); } catch (IOException ex) { System.err.println(ex.toString()); } } Bearbeitet 8. Juli 2009 von Ulfmann Zitieren
perdian Geschrieben 8. Juli 2009 Geschrieben 8. Juli 2009 Dann fang dochmal an systemathisch das ganze zu analysieren - und sowas geht nicht ohne einen Testcase. Daher: Schreib das einfachst mögliche Programm, was den von dir beschriebenen Fehler erzeugt - entweder als JUnit Testcase (das hat den Vorteil, dass du es später als Regressionstest einsetzen kannst) oder direkt als Klasse mit main-Methode. In deinem Fall: Datei schreiben, aus gleicher Datei lesen und sehen was passiert. Wenn du diesen Testcase hast stell ihn hier nochmal ein, so dass er von jemand anders ohne große Probleme auch ausgeführt werden kann. Zusätzlich dann bitte noch folgende Infos mitliefern: Java-Version und Vendor. Zitieren
Ulfmann Geschrieben 8. Juli 2009 Autor Geschrieben 8. Juli 2009 Ich hoffe, ich hab dich jetzt richtig verstanden. Einfaches Beispiel, was die Anforderungen erfüllt: import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; public class FileTest { private String data; public String getDataString() //String aus der Datei lesen und zurück geben { try { FileInputStream fileInput = new FileInputStream("Strings.ser"); ObjectInputStream objectInput = new ObjectInputStream(fileInput); data = (String) objectInput.readObject(); objectInput.close(); } catch (ClassNotFoundException ex) { ex.printStackTrace(); } catch (IOException ioe) { ioe.printStackTrace(); } return data; } public void setDataString(String data) //Datei neu anlegen und den String reinschreiben { try { FileOutputStream fops = new FileOutputStream("Strings.ser"); ObjectOutputStream oos = new ObjectOutputStream (fops); System.out.println("Schreibe " + data + " in die Datei."); oos.writeObject(data); oos.close(); } catch (IOException ex) { System.err.println(ex.toString()); } } } import java.io.*; public class FileTester { public static void main(String [] args) { String eingabe = ""; System.out.println("Bitte einen String eingeben."); BufferedReader inData = new BufferedReader(new InputStreamReader(System.in)); try { eingabe = inData.readLine(); } catch (IOException e) { e.printStackTrace(); } FileTest test = new FileTest(); test.setDataString(eingabe); System.out.println("Inhalt der Datei: " + test.getDataString()); } } Ich benutzte das JDK 1.6.0_13 Zitieren
LadyPreis Geschrieben 9. Juli 2009 Geschrieben 9. Juli 2009 und wo soll da jetzt der Fehler sein? Hab deinen Quellcode 1:1 übernommen und mit 3 verschiedenen JDKs getestet. Läuft immer Zitieren
Ulfmann Geschrieben 9. Juli 2009 Autor Geschrieben 9. Juli 2009 Jetzt isses ja auch richtig so. Das Problem was ich urprünglich hatte, war der mehrmalige Aufruf von readObject() des gleichen InputStreams (der soviele Objekte aus der Datei sammeln soll, wie drin sind). Nun steckt in meiner Datei einfach ein Vector<Object> und die Daten werden dann da rein- und rausgeschaufelt. Somit ist der besagte mehrmalige Aufruf nich mehr nötig. Zitieren
LadyPreis Geschrieben 9. Juli 2009 Geschrieben 9. Juli 2009 Dann erstmal schön, dass es jetzt funktioniert. Wobei ich immer noch nicht verstanden habe, warum er beim ersten Beispiel bei dir Zicken gemacht hat. Ich hatte da ebenfalls mehrmals die readObject-Funktion aufgerufen. Hatte deine Lesen-Methode ja komplett übernommen. Wie dem auch sei: Das Problem ist gelöst Zitieren
Sofus Geschrieben 9. Juli 2009 Geschrieben 9. Juli 2009 Eigentlich beschreibt die Exception sehr schön wo dein Fehler liegt, nämlich dass das was du in die Datei reinschreibst nicht dem entspricht was du aus der Datei auslesen möchtest. Laut JavaDoc wird StreamCorruptedException immer dann geworfen wenn die Kontrollinformation für readObject nicht den KonsistenzCheck bestehen - sprich falsch sind. Zitieren
perdian Geschrieben 9. Juli 2009 Geschrieben 9. Juli 2009 Nun steckt in meiner Datei einfach ein Vector<Object> und die Daten werden dann da rein- und rausgeschaufelt. Somit ist der besagte mehrmalige Aufruf nich mehr nötig.Naja, damit hast du das Problem gekonnt (und sicher auch gut) umschifft, aber was wirklich los war weißt du immer noch nicht - und beim nächsten Mal, wenn du wieder vor einem ähnlichen Fall sitzt geht das Spiel von vorne los. Nichts gegen funktionierende Lösungen (wie hier) aber es ist immer besser zu verstehen, was man gerade falsch gemacht hat anstatt einen - irgendwann verdammt dreckig werdenden - Pfad drum herum zu suchen. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.