Zum Inhalt springen

java.io.StreamCorruptedException


Ulfmann

Empfohlene Beiträge

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 von Ulfmann
Link zu diesem Kommentar
Auf anderen Seiten teilen

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 von Ulfmann
Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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. :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 :D

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.
Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...