Termin in Array speichern/laden

Luggioh

Mitglied
HalliHallo Leute,

muss für mein Studium einen Terminkalender programmieren, den ich auch so gut wie fertig habe, nur hab ich noch ein Problem dass ich einfach nicht lösen kann =(
Ich lege Termine in ein Array an etc... klappt alles. Auch mit BufferedReader und BufferedWriter schaffe ich es auch diese Termine wieder einzulesen und zu speichern.
Bloss schaff ich es einfach nicht die gespeicherten Termine in mein, nach Neustart leeres Array, reinzuladen und somit kann ich diese auch nicht bearbeiten.

Hoffe das ihr mir helfen könnt 😉

Java:
package Testat;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.ObjectOutputStream;
									//Testat Lukas Oppelt
import java.io.Serializable;
import java.util.Scanner;

public class TerminKalender implements Serializable {

	public static void main(String[] args) throws IOException, ClassNotFoundException, NullPointerException {
		
		String datei = "data.txt";
		FileWriter fw = new FileWriter(datei, true);
		BufferedWriter ausgabe = new BufferedWriter(fw);
		EinLesen a = new EinLesen();
		a.DatenEinLesen();
		
		Termin ay = null;
		int anzahlTermine = 3;
		Termin arraylist[] = new Termin[anzahlTermine]; // Initialisierung von
		boolean ProgrammLaeuft = true;
	
		
		
		String s = null;
		Scanner sc1 = new Scanner(System.in);			// Array, Schleifen,
					
									// Scanner
	while (ProgrammLaeuft) {

			new TextMenue(); // textmenü methode wird aufgerufen
			s = sc1.next();

			if (s.equals("n")) 
			{
				NeuenTerminErstellen bb = new NeuenTerminErstellen();
				bb.NeuenTerminAnlegen(arraylist, o, s, sc1, ausgabe,datei);
			}

			else if (s.equals("l")) 
			{ 
				for (int i = 0; i < anzahlTermine; i++) 
				{
					System.out.print("\nTermin " + i + ":\n ");   // Liste aller Termine wird angezeigt
					System.out.println(arraylist[i]);

				}									
				
			}

			else if (s.equals("b")) 
			{   
				Terminbearbeiten aaa = new Terminbearbeiten();
				aaa.TermineBearbeiten(a, anzahlTermine, o, arraylist, sc1, ausgabe,datei,ay);
			}

			
			else if (s.equals("a"))
			{	
				ProgrammLaeuft = false; // Der vorgang wird beendet bzw die // Schleife abgebrochen
				ProgrammAbbruch abb = new ProgrammAbbruch();
				abb.ProgrammAbbrechenSpeichern(ProgrammLaeuft, ausgabe, datei);
			}

			else if (s.equals("d")) 
			{
				KWundWochentag z = new KWundWochentag(); // Hier lässt sich nochmals separat der
				z.KWundWochentagBerechnen();				// Wochentag und die KalenderWoche abfragen
			}
	}
  }
}

EinleseMethode:
Java:
package Testat;
import java.io.*;
import java.io.Serializable;

public class EinLesen implements Serializable {

	public EinLesen(){}
	
	public void DatenEinLesen() throws IOException
	  {
		System.out.println("Ihre bisher eingespeicherten Termine.");
	    BufferedReader br = new BufferedReader(new FileReader("data.txt"));
	    String zeile = null ; 

while ((zeile = br.readLine()) != null)
		{
			System.out.println(zeile);
		}
		br.close();
	 }
}

Java:
public class NeuenTerminErstellen implements Serializable {
	
    public NeuenTerminErstellen(){}
    
	public void NeuenTerminAnlegen (Termin [] arraylist, ObjectOutputStream o,String s, Scanner sc1, BufferedWriter ausgabe, String datei) throws IOException
	{
		
    FileWriter fw = new FileWriter(datei,true);

			 boolean TerminKette = true ;
			 
			 int i = 0; 
			 					//neuer Termin wird erstellt
			while(TerminKette)			//wenn N gedrückt wird
			{	
				System.out.println("Geben Sie eine Nummer für Ihren Termin ein. (0-3)");
				i = sc1.nextInt();
				
				if ( arraylist[i] != null) 
				{
				System.out.println("\nDieser Termin ist bereits belegt.");
				System.out.println("Bitte wählen Sie eine andere Nummer aus.");
				System.out.println("+--------------------------------------+");
				TerminKette = true;
				}
				
				else if(arraylist[i] == null) 
				{
			    arraylist[i]= new Termin();
			    System.out.print("\nTermin "+ i + ":\n ");
			    ausgabe.write("\nTermin "+ i + ":\n ");
			    ausgabe.write(arraylist[i].toString2());
			    System.out.println(arraylist[i].toString());    //Ausgabe von der toString1 Methode
			    
			    System.out.println("+--------------------------------------------------------------+");
			    System.out.println("Ihr Termin wurde in der Datei: " + datei + " abgespeichert.");
			    System.out.println("+--------------------------------------------------------------+");
				i++;
				}
				
				System.out.println("\n\nWas möchten Sie nun tun?\n");
				System.out.println("Wenn Sie erneut einen Termin eingeben wollen, dann drücken Sie die Taste 'n'.");
				System.out.println("Wenn Sie den Vorgang abbrechen wollen, dann drücken Sie die Taste 'a'.\n");
				
				s = sc1.next();
				
				if(s.equals("n")) 
				 {
				   TerminKette = true;   //Abfrage nachdem man Termin erstellt hat
				 }
				
				else if (s.equals("a")) 
				 {
				   TerminKette = false;
				 }
			}
	 }
}


Java:
package Testat;

import java.util.Scanner;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.*;

public class Terminbearbeiten {
	public Terminbearbeiten(){}
	
	public void TermineBearbeiten(EinLesen a, int anzahlTermine, ObjectOutputStream o, Termin [] arraylist, Scanner sc1, BufferedWriter ausgabe,
									String datei, Termin ay) throws IOException
	{
		
		System.out.println("Alle Termine, die Sie bearbeiten können.");
		for (int j = 0; j < anzahlTermine; j++) 
		 { 
			System.out.print("\nTermin " + j + ":\n ");   // Liste aller Termine wird angezeigt
			System.out.println(arraylist[j]);
		 }	
		
		System.out.println("\n+----------------------------------------------------------------------+");
		System.out.println("Welchen Termin möchten Sie bearbeiten?  Geben Sie ihre Terminnummer ein.");
		System.out.println("+----------------------------------------------------------------------+");
		int i = sc1.nextInt();
		
		if(arraylist[i] == null)
		 { 
		 	System.out.println("Ihr Termin ist leer bzw. in Ihrem Termin wurde noch nichts eingetragen. Bitte neu eingeben.");
		 }
		
		else if(i <= anzahlTermine)
		 {
			arraylist[i].TerminBearbeitung();
//			o.writeObject(arraylist);
			ausgabe.write("\nTermin "+i+"(neu)");
			ausgabe.write(arraylist[i].toString2());
		 }
	} 
}
 
Java:
 public void DatenEinLesen()
Das sollte wohl nicht void sein, sondern etwas zurückgeben, was du dann verwenden kannst, um es dann zu verarbeiten.
Wie wärs da mit einer Liste von Objekten, die die Daten enthalten?

Nebenbei ist deine Struktur komisch und deine Klassen haben fürchterliche Bezeichnungen, mal ganz davon abgesehen, dass Methoden in Java im loverCamelCase geschrieben werden sollten (DatenEinLesen => dateinEinLesen).

Viele Methoden sind bei dir dynamisch, machen so aber keinen Sinn.
public void DatenEinLesen() //Könnte wunderbar static sein und in einer persistenz-Klasse liegen
Solche Aufrufe
Java:
NeuenTerminErstellen bb = new NeuenTerminErstellen();
                bb.NeuenTerminAnlegen(arraylist, o, s, sc1, ausgabe,datei);
sollten dir immer komisch vorkommen, wenn du ,,bb'' anschließend nicht mehr brauchst. Auch hier wäre eine statische Methode sinnvoller (oder zumindest eine dynamische Methode an einem sinnvollen Objekt)
 
Zuletzt bearbeitet:
hm also der beitrag war iwie absolut nicht hilfreich! trotzdem danke...
ich will eig nur wissen ob ich meine gespeicherten termine wieder ins array laden kann um sie danach auch wieder zu bearbeiten.
oder ob das einfach nicht funktionieren kann oO
 
Natürlich funktioniert das, nur, wie ich bereits geschrieben habe, musst du dazu eben das Eingelesene nicht einfach nur mit System.out.println ausgeben, sondern eben als Rückgabewert der Methode machen.
 
sprich ich setze bei meiner DateiEinlesen Methode anstatt dem Sysout einfach ein return ein und es funktioniert ?
oder wie genau soll das gehen 😉 ?
 
das return ist einer von vielen Schritten, so wie eine Einkaufstüte den Weg vom Supermarkt (Klasse EinLesen) in die heimische Wohnung oder Küche (main-Methode) finden muss,

aber da gehören noch viele viele andere Dinge dazu:
die Methode DatenEinLesen() macht bisher nicht viel, erstellt keine Termine,
man muss schon auch noch im Supermarkt einkaufen,

außerdem muss jemand die Einkaufstüte zu Hause annehmen, wenn es ein Bote bringt, in der Küche mit den Einkäufen was anfangen, kochen,
in deinem Fall den Rückgabewert in der main-Methode merken, verarbeiten usw.

arraylist aus Zeile 23 sieht dazu verdächtig aus

---------

Variablen und Methoden unbedingt klein schreiben!

arraylist ist ein ganz schlechter Name für eine Variable, für alles außer Typ ArrayList undenkbar, für eine ArrayList selber auch ohne Bedeutung, 'termine' wäre doch was feines
 
kk 😛 werde die schreibweise gleich anpassen. nun stellt sich mir hal nur noch die frage WIE ich das ganze machen soll 😀 problem is hal das ich nich weiß wie ich die gespeicherten strings wieder so einlesen kann das diese als Termine und nicht als Strings gelesen werdn 😀
außerdem bekomm ich den Fehler das ich in meinem TerminArray keine Strings speichern kann -.-
 
in der Datei wird anscheinend toString2() von Termin gespeichert, was das konkret beinhaltet, ist nicht zu sehen, viel mehr als Nummer anscheinend gar nicht

diese Zeile musst du wieder einlesen, dazu evtl. weitere Zeilen mit Nummern, je zwei Zeilen einlesen,
der String muss dann zerlegt werden, nach festen Indexen, bestimmte Zeichen wie auch Leerzeichen suchen, substring() und was es alles gibt,
das ist viel Arbeit, kann man pauschal wenig beschreiben,
komme von den Strings zur Nummer, normalerweise zu weiteren Daten wie Name, Zeitpunkt usw., dann erstelle aus diesen Daten ein neues Termin-Objekt

Tipp:
mit Datei und komplizierten Programm besser nicht testen, schon gar nicht immer mühsam alles eintippen, wobei hier ja bisher nicht so viel

ein praktisches Testprogramm wäre im Moment
Java:
main {
   1. Termin mit Dummy-Inhalt erstellen
   2. Text-Darstellung, ruhig mehrzeilig erstellen, in String speichern
   3. aus diesem Text neuen Termin parsen
   4. gegebenenfalls mit ursprünglichen Termin vergleichen
}
 
ok hier meine toString methode:
Java:
public String toString2()
	{
	return 			"\nName Ihres Termines: " + n + 
					"\nDatum Ihres Termines: " + String.format("%02d.%02d" ,tag ,monat) +"." + this.jahr + 
					"\nUhrzeit Ihres Termines: " + String.format("%02d:%02d" , stunde , minute)  + " Uhr" + 
					"\nBeschreibung Ihres Termines: " + b + 
					System.



und wie trenne ich zum beispiel strings ? gibts da i-einen befehl dafür ?
sodass ich zum beispiel sagen kann : trenne string da oder da und speichere diese zahl als meine Uhrzeit ab etc...
 
so siehts btw aus wenn ich die daten wieder einlese:

Ihre bisher eingespeicherten Termine.

Termin 0:
Name Ihres Termines: fwef
Datum Ihres Termines: 09.12.1991
Uhrzeit Ihres Termines: 09:09 Uhr
Beschreibung Ihres Termines: wwef

Termin 0:
Name Ihres Termines: efe
Datum Ihres Termines: 09.12.1991
Uhrzeit Ihres Termines: 09:09 Uhr
Beschreibung Ihres Termines: wef

aber wie gesagt das ist selber gebastelt und die daten stehen nicht in meinem array sondern einfach mitten im "raum"^^
 
im Zweifel immer einfacher anfang, lasse einen Termin erstmal nur einen Namen bzw. doch nur die Nummer haben
"Nummer: 5"
dann müsstest du erstmal nur an die 5 rankommen, hier substring ab einem bestimmten Index, zählen

nach und nach komplizierter, mehrere Zeilen, mehrere Daten,

irgendwo muss aber auch ein eigenständiger Denkprozess einsetzen/ mitmachen,
man kann nicht immer mehr erklären dazu, außer es komplett für dich zu programmieren,
zumindest sollte es zu intelligenteren Fragen außer 'wie weiter?' reichen

auch immer bedenken:
'wie trenne ich zum beispiel strings java' kann man quasi schon in Suchmaschinen eintippen,
vielleicht fällt dir noch geeigneteres ein
 
soo meine toString methode sieht nun so aus, das ich versuch mit ";" alles zu trennen:

Java:
public String toString2()
	{
	return 			n +";"+ 
					String.format("%02d.%02d" ,tag ,monat) +"." + this.jahr + ";" +
					"Uhrzeit Ihres Termines: " + String.format("%02d:%02d" , stunde , minute)  + " Uhr" +";"+ 
					b + ";"+
					System.getProperty("line.separator") ;

sieht dann so aus : aaaaaa;bbbbbb;9.12.1991;12:12;

damit hab ichs versucht wieder getrennt einzulesen aber funktioniert natürlich nicht😀 :

Java:
package Testat;

import java.io.IOException;

public class Strings {
	
	public String split(String zeile, EinLesen a, String datei )  throws NullPointerException, IOException{
		
		String input = zeile;
		String results[] = new String[10];
		results  = input.split(";");
			for (int i = 0; i < 7; i++)
				{
				    System.out.println(results);
				}
			return input;
	}
}
 
du musst kein new String[10] anlegen, split liefert so oder so ein eigenes Array,

was genau funktioniert nicht, Fehlermeldung, erscheint Ausgabe aber falsch? immer dazuschreiben

results ist ein Array, das kann man direkt schlecht ausgeben, Arrays.toString() gibts aber schon,
willst du in der Schleife nicht eher jeweils das i-te Element printen?
 
Termin 0:
Name Ihres Termines: wf
Datum Ihres Termines: 09.12.1991
Uhrzeit Ihres Termines: 09:09 Uhr
Beschreibung Ihres Termines: wef

Termin 2: wfwef;09.12.1991;Uhrzeit Ihres Termines: 09:09 Uhr;wef;

Exception in thread "main" java.lang.NullPointerException
at Testat.Strings.split(Strings.java:11)
at Testat.TerminKalender.main(TerminKalender.java:30)

ich hab zwar schon try catch blöcke gemacht aber trotzdem immer wieder NPException oO

Und ich habe versucht den Termin 2 als String zu speichern um ihn dann einzulesen aber scheinbar funktioniert das nicht ...
 
steht
> throws NullPointerException
an der Methode, weil dieser Fehler im Moment noch z.B. bei split auftritt?
originelle Behandlung, so glaube ich noch nicht gesehen,

generell schreibt man 'throws NullPointerException' quasi nie irgendwo ran,
allein schon weil es eine RuntimeException ist, da muss man das nicht machen,

zur Dokumentation natürlich erlaubt, aber nur wenn man doch die Exception selber wirft, was bei NullPointerException natürlich keinen Sinn erkennen läßt, da kann man genug anderes werfen

------

zeile scheint null zu sein (herausfinden!, ausgeben), was soll man an der Methode erkennen woran das liegt?
der Aufrufer ist interessant,
möglicherweise gehen die meisten Zeilen der Datei nur irgendwann zum Schluss wird letztlich immer null eingelesen,
was sonst?
da muss man dann rechtzeitig abbrechen, normalerweise nicht schwer
> while ((zeile = br.readLine()) != null)
aus dem ersten Post wäre korrekte Kontrolle
 
bekomme nun das : Termin 2: wfwef;09.12.1991;Uhrzeit Ihres Termines: 09:09 Uhr;wef;
zeile = null
java.lang.NullPointerException
at Testat.EinLesen.split(EinLesen.java:45)
at Testat.TerminKalender.main(TerminKalender.java:26)

zeile soll gleich null sein .... sehr komisch ^^

frage mich grad nur wieso und vor allem wann die zeile gleich null wird oO eig kanns nich sein 😀


Java:
public class EinLesen implements Serializable {


	public EinLesen(){}
	String zeile;
	public void DatenEinLesen() 
	  {
		
//		System.out.println("Ihre bisher eingespeicherten Termine.");
	    BufferedReader br = null;
		try 
		{
			br = new BufferedReader(new FileReader("data.txt"));
		} 
		catch (FileNotFoundException e1) 
		{
			e1.printStackTrace();
		}
    
  try 
  {
	while ((zeile = br.readLine()) != null)
			{
				System.out.println(zeile);
			}
			br.close();
	} 
  catch (IOException e) 
  {
	e.printStackTrace();
  }
}
	
	
	
	public void split(String datei, BufferedReader br)  {
	
		System.out.println(zeile);
		try {
			String input = zeile;
			String results[] = input.split(";");
			
				for (int i = 0; i < 7; i++)
					{
					    System.out.println(results[i]);
					}
			} 
		catch (Exception e) 
		{
			e.printStackTrace();
		}
	}
}
 
dein Code bringt jedenfalls keine Aufklärung, split wird nirgendwo aufgerufen..

> at Testat.TerminKalender.main(TerminKalender.java:26)
wäre interessant

packages übrigens klein schreiben..
all die Standards, zu sehen an allen API-Klassen (import java.io.Klasse statt import Java.IO.Klasse), sie sind ja so schwer
 
so hier mal bis zeile 20 ^^ verkaggt -.- in zeile 4 kommt die split methode^^

Java:
		String s = null;
		Scanner sc1 = new Scanner(System.in);			// Array, Schleifen,
	
		a.split(datei, br );
			// Scanner
	while (ProgrammLaeuft) {

			new TextMenue(); // textmenü methode wird aufgerufen
			s = sc1.next();

			if (s.equals("n")) 
			{
				NeuenTerminErstellen bb = new NeuenTerminErstellen();
				bb.NeuenTerminAnlegen(termine, o, s, sc1, ausgabe,datei);
			}

			else if (s.equals("l")) 
			{ 
				for (int i = 0; i < anzahlTermine; i++) 
				{
					System.out.print("\nTermin " + i + ":\n ");   // Liste aller Termine wird angezeigt 			
					System.out.println(termine[i]);
				}									
			
			}

			else if (s.equals("b")) 
			{   
				Terminbearbeiten aaa = new Terminbearbeiten();
				aaa.TermineBearbeiten(a, anzahlTermine, o, termine, sc1, ausgabe,datei,ay);
			}

			
			else if (s.equals("a"))
			{	
				ProgrammLaeuft = false; // Der vorgang wird beendet bzw die // Schleife abgebrochen
				ProgrammAbbruch abb = new ProgrammAbbruch();
				abb.ProgrammAbbrechenSpeichern(ProgrammLaeuft, ausgabe, datei);
			}

			else if (s.equals("d")) 
			{
				KWundWochentag z = new KWundWochentag(); // Hier lässt sich nochmals separat der
				z.KWundWochentagBerechnen();				// Wochentag und die KalenderWoche abfragen
			}
	}
  }
}
 
hat split() zwischenzeitlich nur noch 2 Parameter?

interessante unerwähnte Änderung zur Version von 16:39

was als Datei übergeben wird ist nicht zu erkennen, wäre in der Hinsicht also nicht hilfreich, vielleicht aber noch der Dateiname vom Anfang

wird nun also mit dem Instanzattribut zeile in der Klasse EinLesen gearbeitet?
dies ist zu Beginn und am Ende der Methode DatenEinLesen(), also wohl immer null

die Zeilen musst du natürlich (wo sonst?) in der Schleife beim Einlesen verarbeiten, oder alle zwischenspeichern und später verarbeiten

Java:
while ((zeile = br.readLine()) != null)
{
     System.out.println(zeile);
   split(); // bisherige Parameter unsinnig, 
   // vielleicht aber auf Instanzattribut zeile besser verzichten 
   // und hier dann nun wirklich als einen Parameter übergeben
}

Rückgabewert von split() muss natürlich verarbeitet werden usw., tausende Schritte nötig,
das war bisher nur die Arbeit für 2 Min., wenn alles so lange dauert..

es ist leider nicht leicht anscheinend, ich bin nun weg
 
jojo danke trotzdem schon mal^^ habs ez schon mal hinbekommen die gespeicherten termine zu trennen mit strichpunkten^^
nexter schritt wäre dann die verschiedenen ziffern bzw. datum etc. wieder in meine Integer/String variablen zu speichern un diese dann wiederum ins array 😀 ma sehen^^
 

Neue Themen


Zurück
Oben