Input/Output Persistentes Speichern von Objekten

H

Hilfe1992

Gast
Hi

brauch mal Hilfe beim Speichern und Laden von Dateien. Hab im Moment nen halben TerminKalender(ganz einfach ohne GUI...). Und nja die Termine sollten persistent gespeichert werden. Aber ich komm grad net weiter ich kann sie zwar anscheinend speichern aber nicht einlesen.


Java:
import java.io.*;

public class Termin implements Comparable<Termin>, Serializable
{
	private String terminName, anmerkung;
	private int jahr, monat, tag, uhrZeitStd, uhrZeitMin;
	
	public Termin(String terminName, int jahr, int monat, int tag, int uhrZeitStd, int uhrZeitMin, String anmerkung)

	{
		this.terminName = terminName;
		this.jahr = jahr;
		this.monat = monat;
		this.tag = tag;
		this.uhrZeitStd = uhrZeitStd;
		this.uhrZeitMin = uhrZeitMin;
		this.anmerkung = anmerkung;
	}
	

	@Override
	public String toString() {

		return "|| " + terminName + "\t\t\t||" + tag + "." + monat + "." + jahr + "\t|| " + uhrZeitStd + ":" + uhrZeitMin + 
				"\t|| " + anmerkung + "\t\t\t\t\t\t\t||";
	}
	
	public int compareTo(Termin o)
	{
	    if (this.jahr < o.jahr) 
	    {
	        return -1;
	    } 
	    else if (this.jahr > o.jahr) 
	    {
	        return 1;
	    } 
	    else 
	    {
	        if (this.monat < o.monat) 
	        {
	          return -1;
	        } 
	        else if (this.monat > o.monat) 
	        {
	          return 1;
	        } 
	        else 
	        {
	        	if(this.tag < o.tag)
	        	{
	        		return -1;
	        	}
	        	else if(this.tag > o.tag)
	        	{
	        		return 1;
	        	}
	        	else
	        	{
	        		if(this.uhrZeitStd < o.uhrZeitStd)
	        		{
	        			return -1;
	        		}
	        		else if(this.uhrZeitStd > o.uhrZeitStd)
	        		{
	        			return 1;
	        		}
	        		else
	        		{
	        			if(this.uhrZeitMin < o.uhrZeitMin)
	        			{
	        				return -1;
	        			}
	        			else if(this.uhrZeitMin > o.uhrZeitMin)
	        			{
	        				return 1;
	        			}
	        			else
	        			{
	        				return 0;
	        			}
	        		}
	        	}
	        }
	    }
	}

	
	public String getTerminName() {
		return terminName;
	}
	public void setTerminName(String terminName) {
		this.terminName = terminName;
	}

	public int getJahr() {
		return jahr;
	}
	public void setJahr(int jahr) {
		this.jahr = jahr;
	}
	
	public int getMonat() {
		return monat;
	}
	public void setMonat(int monat) {
		this.monat = monat;
	}
	
	public int getTag() {
		return tag;
	}
	public void setTag(int tag) {
		this.tag = tag;
	}
	
	public int getUhrZeitStd() {
		return uhrZeitStd;
	}
	public void setUhrZeitStd(int uhrZeitStd) {
		this.uhrZeitStd = uhrZeitStd;
	}
	
	public int getUhrZeitMin() {
		return uhrZeitMin;
	}
	public void setUhrZeitMin(int uhrZeitMin) {
		this.uhrZeitMin = uhrZeitMin;
	}
	
	public String getAnmerkung() {
		return anmerkung;
	}
	public void setAnmerkung(String anmerkung) {
		this.anmerkung = anmerkung;
	}
}

Java:
import java.io.*;
import java.util.*;

public class Kalender 
{
	int index = 0;
	int terminNr = index+1;
	Termin Termine[] = new Termin[5000];
	ObjectOutputStream o = null;
	ObjectInputStream i =null;
	
	public Kalender(){}
	
	public void NeuerTermin()
	{
		Scanner scanInt = new Scanner(System.in);
		Scanner scanName = new Scanner(System.in);
		Scanner scanAnmerkung = new Scanner(System.in);
		String terminName, anmerkung;
		int jahr, monat, tag, uhrZeitStd, uhrZeitMin;
		
		try
		{
			o = new ObjectOutputStream(new FileOutputStream("Termin.dat",true));
		}
		catch(Exception e)
		{
			System.exit(0);
		}
		
		scanInt.reset();
		scanName.reset();
		scanAnmerkung.reset();
		
		while(true)
		{
			System.out.println("Geben sie bitte den Namen des Termines ein.");
			try
			{
				terminName = scanName.nextLine();
				break;
			}
			catch(InputMismatchException e)
			{
				scanName.next();
				System.out.println("Sie haben einen ungültigen Terminnamen eingegeben.");
			}
		}
		
		while(true)
		{
			System.out.println("Geben sie bitte das Jahr des Termines ein.");
			try
			{
				jahr = scanInt.nextInt();
				if(jahr>2010 && jahr<5000)
					break;
				else
					System.out.println("Bitte beachten sie, das die Eingabe größer als 2010 sein muss.\n");
			}
			catch(InputMismatchException e)
			{
				scanInt.next();
				System.out.println("Sieh haben ein ungültiges Jahr eingegeben.");
				System.out.println("Bitte beachten sie, das die Eingabe größer als 2010 sein muss.\n");
			}
		}
		
		while(true)
		{
			System.out.println("Geben sie bitte den Monat des Termines ein.");
			try
			{
				monat = scanInt.nextInt();
				if(monat>0 && monat<13)
					break;
				else
					System.out.println("Bitte beachten sie, das die Eingabe zwischen 1 und 12 sein muss.\n");
			}
			catch(InputMismatchException e)
			{
				scanInt.next();
				System.out.println("Sie haben einen ungültigen Monat eingegeben.");
				System.out.println("Bitte beachten sie, das die Eingabe zwischen 1 und 12 sein muss.\n");
			}
		}
		
		TagWhileSchleife:
		while(true)
		{
			System.out.println("Geben sie bitte den Tag des Termines ein.");
			try
			{
				tag = scanInt.nextInt();
				if((jahr%4 == 0)&&(jahr%100 != 0)||(jahr%400 == 0))
				{
					//Schaltjahr
					switch(monat)
					{
						case 1:
							if(tag>0 && tag<32)		
								break TagWhileSchleife;
							else
								break;
						case 2:
							if(tag>0 && tag<30)		
								break TagWhileSchleife;
							else
								break;
						case 3:
							if(tag>0 && tag<32)		
								break TagWhileSchleife;
							else
								break;
						case 4:
							if(tag>0 && tag<31)		
								break TagWhileSchleife;
							else
								break;
						case 5:
							if(tag>0 && tag<32)		
								break TagWhileSchleife;
							else
								break;
						case 6:
							if(tag>0 && tag<31)		
								break TagWhileSchleife;
							else
								break;
						case 7:
							if(tag>0 && tag<32)		
								break TagWhileSchleife;
							else
								break;
						case 8:
							if(tag>0 && tag<32)		
								break TagWhileSchleife;
							else
								break;
						case 9:
							if(tag>0 && tag<31)		
								break TagWhileSchleife;
							else
								break;
						case 10:
							if(tag>0 && tag<32)		
								break TagWhileSchleife;
							else
								break;
						case 11:
							if(tag>0 && tag<31)		
								break TagWhileSchleife;
							else
								break;
						case 12:
							if(tag>0 && tag<32)		
								break TagWhileSchleife;
							else
								break;
						default:
							System.err.println("Fehler. \nDas Programm wird beendet.");
							System.exit(0);
					}
				}
				else
				{
					//kein Schaltjahr
					switch(monat)
					{
						case 1:
							if(tag>0 && tag<32)		
								break TagWhileSchleife;
							else
								break;
						case 2:
							if(tag>0 && tag<29)		
								break TagWhileSchleife;
							else
								break;
						case 3:
							if(tag>0 && tag<32)		
								break TagWhileSchleife;
							else
								break;
						case 4:
							if(tag>0 && tag<31)		
								break TagWhileSchleife;
							else
								break;
						case 5:
							if(tag>0 && tag<32)		
								break TagWhileSchleife;
							else
								break;
						case 6:
							if(tag>0 && tag<31)		
								break TagWhileSchleife;
							else
								break;
						case 7:
							if(tag>0 && tag<32)		
								break TagWhileSchleife;
							else
								break;
						case 8:
							if(tag>0 && tag<32)		
								break TagWhileSchleife;
							else
								break;
						case 9:
							if(tag>0 && tag<31)		
								break TagWhileSchleife;
							else
								break;
						case 10:
							if(tag>0 && tag<32)		
								break TagWhileSchleife;
							else
								break;
						case 11:
							if(tag>0 && tag<31)		
								break TagWhileSchleife;
							else
								break;
						case 12:
							if(tag>0 && tag<32)		
								break TagWhileSchleife;
							else
								break;
						default:
							System.err.println("Fehler. \nDas Programm wird beendet.");
							System.exit(0);
					}
				}
				System.out.println("Bitte beachten sie, das die Eingabe zwischen 1 und 28,29,30 oder 31 sein muss.\n");
			}
			catch(InputMismatchException e)
			{
				scanInt.next();
				System.out.println("Sie haben einen ungültigen Tag eingegeben.");
				System.out.println("Bitte beachten sie, das die Eingabe zwischen 1 und 28,29,30 oder 31 sein muss.\n");
			}
		}
		
		while(true)
		{
			System.out.println("Geben sie bitte die Uhrzeit(Stunden) des Termines ein.");
			try
			{
				uhrZeitStd = scanInt.nextInt();
	
				if(uhrZeitStd>=0 && uhrZeitStd<24)
					break;
				else
					System.out.println("Bitte beachten sie, das die Eingabe zwischen 0 und 23 sein muss.(24H Form).\n");
			}
			catch(InputMismatchException e)
			{
				scanInt.next();
				System.out.println("Sie haben eine ungültige Uhrzeit(Stunden) eingegeben.");
				System.out.println("Bitte beachten sie, das die Eingabe zwischen 0 und 23 sein muss.(24H Form).\n");
			}
		}
		
		while(true)
		{
			System.out.println("Geben sie bitte die Uhrzeit(Minuten) des Termines ein.");
			try
			{
				uhrZeitMin = scanInt.nextInt();
				if(uhrZeitMin>=0 && uhrZeitMin<60)
					break;
				else
					System.out.println("Bitte beachten sie, das die Eingabe zwischen 0 und 59 sein muss.\n");	
			}
			catch(InputMismatchException e)
			{
				scanInt.next();
				System.out.println("Sie haben eine ungültige Uhrzeit eingegeben.");
				System.out.println("Bitte beachten sie, das die Eingabe zwischen 0 und 59 sein muss.\n");	
			}
		}
		
		while(true)
		{
			System.out.println("Geben sie bitte eine Anmerkung zum Termines ein.");
			try
			{
				anmerkung = scanAnmerkung.nextLine();
				break;
			}
			catch(InputMismatchException e)
			{
				scanAnmerkung.next();
				System.out.println("Sie haben eine ungültige Anmerkung eingegeben.\n");
			}
		}
		
		System.out.println("Ihre Termin wurde hinzugefügt.\n\n");
		Termine[index] = new Termin(terminName, jahr, monat, tag, uhrZeitStd, uhrZeitMin, anmerkung);
		try 
		{
			o.writeObject(Termine[index]);
		}
		catch (Exception e) 
		{
			System.exit(0);
		}
		index++;
		Hauptmenue();
	}
	
	
	public void TermineAusgeben()
	{	
		int menueAuswahl;
		Scanner scanInt = new Scanner(System.in);
		
		try 
		{
			i = new ObjectInputStream(new FileInputStream("Termin.dat"));
		} 
		catch (Exception e) 
		{
			System.exit(0);
		}
		
		for(int a =0;;a++)
		{
			try 
			{
				Termine[a] = (Termin) i.readObject();
			} 
			catch (ClassNotFoundException e) 
			{
				e.printStackTrace();
				System.exit(0);
			} 
			catch (IOException e) 
			{
				e.printStackTrace();
				System.exit(0);
			}
			catch(Exception e)
			{
				break;
			}
		}
		
		System.out.println("Ihre bisherigen Termine:");
		System.out.print("|| Nr. \t");
		System.out.print("|| Terminname: \t\t");
		System.out.print("|| Datum: \t");
		System.out.print("|| Uhrzeit: \t");
		System.out.println("|| Anmerkung: \t\t\t\t\t\t\t||");
		

		for(int i = 0; i<this.index;i++)
		{
			System.out.print("|| " + (i+1) + "\t");
			System.out.println(Termine[i].toString());
			terminNr++;
		}
		
		//Menü zum Auswählen der nächsten Aktion....wird per While-Schleife getan.
		System.out.println("\n\nWelche Option wollen sie vornehmen?\n");
		System.out.println("\t 1 Den Termin ändern.");
		System.out.println("\t 2 Kalenderwoche und Wochentag des Termines ausgeben.");
		System.out.println("\t 3 Zurück ins Hauptmenü.");
		System.out.println("\t 4 Programm beenden.");

		while(true)
		{
			System.out.println("Bitte geben sie die Zahl vor der Option ein.");
			try
			{
				menueAuswahl = scanInt.nextInt();
				if(menueAuswahl>0 && menueAuswahl<5)
					break;
				else
					System.out.println("Sie haben eine ungültige Zahl eingegeben. Bitte versuche sie es erneut.");
			}
			catch(Exception e)
			{
				System.out.println("Sie haben eine ungültige Zahl eingegeben.");
				System.out.println("Bitte geben sie erneut eine Zahl ein.(1-4)");
				scanInt.next();
			}
		}
		switch(menueAuswahl)
		{
			case 1:
				TerminAendern();
				break;
			case 2:
				KalenderWoche();
				break;
			case 3:
				Hauptmenue();
				break;
			case 4:
				System.out.println("Auf Wiedersehen!");
				System.exit(0);
				break;
			default:
				System.err.println("Fehler. \nDas Programm wird beendet.");
				System.exit(0);
				break;
				
		}
	}

Fehlt noch die Main die alles aufruft... aber die is eig Wayne. Also krieg da nen Fehler den ich mal überhaupt nicht versteh. Er schreibt die Daten in die Datei, aber das auslesen funktioniert überhaupt nicht.

Fehler ist:
Code:
java.io.StreamCorruptedException: invalid type code: AC
	at java.io.ObjectInputStream.readObject0(Unknown Source)
	at java.io.ObjectInputStream.readObject(Unknown Source)
	at testat.Kalender.TermineAusgeben(Kalender.java:333)
	at testat.Kalender.Hauptmenue(Kalender.java:1038)
	at testat.Main.main(Main.java:40)

Danke schonmal. Hoffe mal bei dem Code blickt einer durch. Hab net alles von den klassen reingeschrieben. Vor allem Kalender is es nur des wichtigste.

mfg
 
B

bygones

Gast
warum nutzt du nicht einfach die Date Klasse aus Java ?

das einlesen schaut auch nicht so schoen aus... gotos nutzte man glaub ich mal vor 40 Jahren in Sprachen

lass doch einfach ein Datum ala 19.12.2012 eingeben und Uhrzeit ala 10:45
 
H

Hilfe1992

Gast
Wir sollen Date... nicht nutzen. Und wie man es anders einlesen soll, fiel mir nicht ein.
 
H

Hallo1992

Gast
Keiner mehr ne Idee, denn ich komm immer noch net weiter...

Geht eig nur um den Object Array speichern. Das reinschreiben klappt ja aber das auslesen bereitet mir Probleme
 
H

Hallo1992

Gast
Hm wär ja ne Idee, aber ich würd halt auch gern wissen wie es so geht. Weil den Array termine müsste man ja so iwie auch in ne datei speichern und wieder einlesen können. Oder nicht??
 

Final_Striker

Top Contributor
Termin Informationen im CSV Format speichern. Dann hast du für jeden Termin eine Zeile.
Einfach zu speichern und auch wieder auszulesen. Außerdem kannst du auch leicht überprüfen ob alles richtig gespeichert wird.
 
M

MMXXI

Gast
Fehlt vielleicht nicht die [c]i.readObject();[/c] Ausführung, womöglich hab ich mich übersehen?
 
H

Hilfe1992

Gast
Termin Informationen im CSV Format speichern. Dann hast du für jeden Termin eine Zeile.
Einfach zu speichern und auch wieder auszulesen. Außerdem kannst du auch leicht überprüfen ob alles richtig gespeichert wird.

Kann ich leider net :(

Fehlt vielleicht nicht die i.readObject(); Ausführung, womöglich hab ich mich übersehen?

Doch is drin. Zeile 319

Java:
            try 
            {
                Termine[a] = (Termin) i.readObject();
            } 
            catch (ClassNotFoundException e) 
            {
                e.printStackTrace();
                System.exit(0);
            } 
            catch (IOException e) 
            {
                e.printStackTrace();
                System.exit(0);
            }
            catch(Exception e)
            {
                break;
            }
        }
 

Oben