Persistente Speicherung

Luggioh

Mitglied
Guten Tag Leute,

und zwar habe ich folgendes Problem.
Ich soll einen Kalender programmieren, bei dem man in einem TerminArray jeweils für einen Termin ein Datum,Name,Beschreibung etc eingeben kann. Das hab ich alles locker hinbekommen.
Aber nun sollen wir das Array bzw die Termine persistens abspeichern und wenn man Eclipse schließt und neustartet, sollen diese Termine auch wieder da sein und mein Array mit diesen Terminen gefüllt sein.
Wie mache ich das ???? hier mein Code.

Java:
package Testat;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.PrintWriter;
import java.io.FileNotFoundException; //Testat Lukas Oppelt
import java.io.Serializable;
import java.util.Scanner;

public class TerminKalender implements Serializable {

	public static void main(String[] args) throws IOException {
		
//		FileWriter fw = new FileWriter("data.txt");
//		BufferedWriter ausgabe = new BufferedWriter(fw);
//		new EinLesen();

		
		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")) 
			{
				new NeuenTerminErstellen(arraylist, s, sc1, ausgabe);
			}

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

			else if (s.equals("b")) 
			{
				new TerminBearbeiten(arraylist, sc1, ausgabe);
			}

			
			else if (s.equals("a"))
			{
				ProgrammLaeuft = false; // Der vorgang wird beendet bzw die
										// Schleife abgebrochen    // wenn A gedrückt wird
				System.out.println("-----------------------------------------------------------");
				System.out.println("\nDer Vorgang wurde beendet.");
				System.out.println("Starten Sie das Programm neu, um weiter arbeiten zu können.");
				ausgabe.flush();
				ausgabe.close();
			}

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


Java:
package Testat;
import java.io.BufferedReader;

import java.io.BufferedWriter;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.util.Scanner;
import java.io.FileWriter;
import java.io.Serializable;

public class NeuenTerminErstellen implements Serializable {
	
    
	public NeuenTerminErstellen (Termin [] arraylist, String s, Scanner sc1, BufferedWriter ausgabe) throws IOException
	{
	
    FileWriter fw = new FileWriter("data.txt");

			 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();
			    arraylist[i]= new Termin();
			    
			    System.out.print("\nTermin "+ i + ":\n ");
			    ausgabe.write("\nTermin "+ i + ":\n ");
			    ausgabe.write(System.getProperty("line.separator"));
			    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: " + " 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.io.Serializable;
import java.util.Scanner;

public class Termin implements Serializable  {
	
	
	String n, b, weekday;
	int anzahlTermine = 5 ;
	Termin arraylist[] = new Termin [anzahlTermine];
int tag,monat,jahr;
	    				//Datum des Termines
	int stunde = 0;
	int minute = 0;     	//Uhrzeit des Termins

	int wochentag;
	int kw ;
	
	
	
public Termin()  {
	
	

		boolean Pruefen = true; // Neuen Termin erstellen

		while (Pruefen) {

			Scanner sc = new Scanner(System.in); // TagesEingabe
			System.out.println("\nBitte geben Sie den Tag Ihres Termines ein.");
			tag = sc.nextInt();

			if (tag > 31 || tag < 1) 
			{
				new Fehlereingabe(Pruefen, b, sc, null);
			}

			else if (tag <= 31 && tag > 0) 
			{
				Pruefen = false;
			}

			Scanner sc1 = new Scanner(System.in); // MonatsEingabe
			System.out.println("Bitte geben Sie den Monat Ihres Termines ein.");
			monat = sc1.nextInt();

			if (monat > 12 || monat < 1) 
			{
				new Fehlereingabe(Pruefen, b, sc1, null);
			}
			
			else if (monat <= 12 && monat > 0) 
			{
				Pruefen = false;
			}

			Scanner sc2 = new Scanner(System.in); // JahresEingabe
			System.out.println("Bitte geben Sie das Jahr Ihres Termines ein.");
			jahr = sc2.nextInt();

			if (jahr > 3000 || jahr < 1000) 
			{
				new Fehlereingabe(Pruefen, b, sc2, null);
			}

			else if (jahr <= 3000 && jahr >= 1000) 
			{
				Pruefen = false;
			}

			Scanner sc3 = new Scanner(System.in); // StundenEingabe
			System.out.println("Bitte geben Sie die Stunde Ihres Termines ein. (00 - 23 Uhr)");
			stunde = sc3.nextInt();

			if (stunde > 23 || stunde < 0)
			{
				new Fehlereingabe(Pruefen, b, sc3, null);
			}

			else if (stunde <= 23 && stunde >= 0) 
			{
				Pruefen = false;
			}

			Scanner sc4 = new Scanner(System.in); // MinutenEingabe
			System.out.println("Bitte geben Sie die Minute Ihres Termines ein. (00 - 59) ");
			minute = sc4.nextInt();

			if (minute > 59 || minute < 0) 
			{
				new Fehlereingabe(Pruefen, b, sc4, null);
			}

			else if (minute <= 59 && minute >= 0) 
			{
				Pruefen = false;
			}

//	} // Ende der while-Schleife /////////////////////////////////////////////
	
	
	  Scanner scr = new Scanner (System.in);
	  System.out.println("\nBitte geben Sie einen Namen für Ihren Termin ein.");
	  n = scr.nextLine();													//Eingabe von Name und 
	  																		//Beschreibung des Termines
	  
	  Scanner scb = new Scanner (System.in);
	  System.out.println("Bitte geben Sie eine Beschreibung für Ihren Termin ein.");
	  b = scb.nextLine();
	  
	  
	 /////////////////////////////////testat 1////////////////////////////////////////////////
	  
	  
	  
	  if  ((tag>31) || (monat>12) || (jahr>=3000 || jahr<1000)) 
		{
	
			System.out.println("Fehler bei Ihrer Eingabe.");			//Ausgabe bei falsches Datumseingabe				
			System.out.println("Bitte neues Datum eingeben!");
	    }


	  else if ((tag<32) && (monat<13) && (jahr<=3000 && jahr>1000))         //Überprüfung ob gültiges Datum eingegeben wurde!
		{															     //Tag < 32  und Monat < 13 und Jahr 
																				//zwischen 1600 und 3000
			
			
		if((jahr % 400 == 0) && (jahr % 100 == 0) || (jahr % 4 == 0))       //Überprüfung ob 
		{																	//Schaltjahr oder nicht	
		
			int monatsziffer = 0;    			// Hier ist es ein Schaltjahr
			
      switch(monat)
      {
      case 1:
      	monatsziffer = 0; break;                //Januar
      case 2:										
      	monatsziffer = 3;break;					//Februar
      case 3:
      	monatsziffer = 3;break;					//Maerz
      case 4:
      	monatsziffer = 6;break;					//April		     //Switch zwischen den 12 Monaten
      case 5:
      	monatsziffer = 1;break;					//Mai
      case 6:
      	monatsziffer = 4;break;					//Juni
      case 7:
      	monatsziffer = 6; break;				//Juli
      case 8:
      	monatsziffer = 2;break;					//August
      case 9:
      	monatsziffer = 5;break;					//September
      case 10:
      	monatsziffer = 0;break;					//Oktober
      case 11:
          monatsziffer = 3;break;					//November
      case 12:
          monatsziffer = 5;break;					//Dezember
      }
      
      
     int aMonatsziffer=monatsziffer;  								//Berechnung Monatsziffer
     //System.out.println("AM "+aMonatsziffer);
      
     int sjahr= 0;  													//keine SchaltjahrKorrektur
     //System.out.println("SJ "+sjahr);
     
	   int tagesziffer = tag%7; 										//Berechnung Tagesziffer
	   //System.out.println("tagesziffer "+tagesziffer);					
	   
	   int jahreszahl = jahr%100; 
	   //System.out.println("JZ "+jahreszahl);
	   int jahresziffer = (jahreszahl+(jahreszahl/4))%7;				//Berechnung Jahresziffer (z.B.xx91)
	   //System.out.println("JZIF "+jahresziffer);
	   
	   int jahrhdt= (int)jahr/100;
	   //System.out.println("JH "+jahrhdt);								//Berechnung Jahrhundertziffer (z.B.19xx)
	   int jahrhundertziffer = (3-(jahrhdt%4))*2; 
	   //System.out.println("JHZIF "+jahrhundertziffer);

	   int wochentag;														
	   wochentag = (tagesziffer+aMonatsziffer+jahresziffer+jahrhundertziffer+sjahr) % 7;
	   						//Alle Werte zusammenrechnen und mit
	   						//Modulo 7 den Wochentag bestimmen

	   int tage = 0;

      switch(monat)
      {
      case 12:
      	tage += 30;
      case 11:
      	tage += 31; 
      case 10:
      	tage += 30; 
      case 9:
      	tage += 31; 
      case 8:
      	tage += 31; 
      case 7:										//Switch zwischen den 12 Monaten
      	tage += 30; 
      case 6:
      	tage += 31;
      case 5:
      	tage += 30; 
      case 4:
      	tage += 31; 
      case 3:
      	tage += 29; 
      case 2:
          tage += 31; 
      case 1:
          tage += tag; 
      }
      
     kw = 0 ;
      
      if (tage % 7 < 3)
       { 							//Berechnungen zur Kalenderwoche
      	 kw = tage/7 ;
       } 
      
      else if(tage%7>3)
        {
           kw = (tage-1)/7+1 ;
        }
     
	      
      
		   switch (wochentag) 
			  {
				case 0:
					weekday ="Sonntag";
					break;
			case 1:
				weekday ="Montag";
					break;
			case 2:
				weekday ="Dienstag";
					 break;															      
				case 3:
					weekday ="Mittwoch";
					break;	
				case 4:
					weekday ="Donnerstag";
					break;
				case 5:
					weekday ="Freitag";
					break;
				case 6:
					weekday ="Samstag";
					break;
				  }
				}
	
		
else 								//else-Funktion wenn kein Schaltjahr
		
	{
		if ((tag>28) && (monat==2))
				
			{
				System.out.println("\nEs ist ein Fehler aufgetreten!");
				System.out.println("Im Jahr "+jahr+" gibt es keinen 29ten Februar, weil es kein Schaltjahr ist.\n");
				System.out.println("Bitte neues Datum eingeben.");
			}
			
		else
				
			{
				
			int monatsziffer = 0;
			
		       switch(monat)
		        {
		        case 1:
		        	monatsziffer = 0; break;                //Januar
		        case 2:										
		        	monatsziffer = 3;break;					//Februar
		        case 3:
		        	monatsziffer = 3;break;					//Maerz
		        case 4:
		        	monatsziffer = 6;break;					//April		     //Switch zwischen den 12 Monaten
		        case 5:
		        	monatsziffer = 1;break;					//Mai
		        case 6:
		        	monatsziffer = 4;break;					//Juni
		        case 7:
		        	monatsziffer = 6; break;				//Juli
		        case 8:
		        	monatsziffer = 2;break;					//August
		        case 9:
		        	monatsziffer = 5;break;					//September
		        case 10:
		        	monatsziffer = 0;break;					//Oktober
		        case 11:
		            monatsziffer = 3;break;					//November
		        case 12:
		            monatsziffer = 5;break;					//Dezember
		        }
		        
	        
	        
		       int aMonatsziffer=monatsziffer;  								//Berechnung Monatsziffer
		       //System.out.println("AM "+aMonatsziffer);
		        
		       int sjahr= 0;  													//keine SchaltjahrKorrektur
		       //System.out.println("SJ "+sjahr);
		       
			   int tagesziffer = tag%7; 										//Berechnung Tagesziffer
			   //System.out.println("tagesziffer "+tagesziffer);					
			   
			   int jahreszahl = jahr%100; 
			   //System.out.println("JZ "+jahreszahl);
			   int jahresziffer = (jahreszahl+(jahreszahl/4))%7;				//Berechnung Jahresziffer (z.B.xx91)
			   //System.out.println("JZIF "+jahresziffer);
			   
			   int jahrhdt= (int)jahr/100;
			   //System.out.println("JH "+jahrhdt);								//Berechnung Jahrhundertziffer (z.B.19xx)
			   int jahrhundertziffer = (3-(jahrhdt%4))*2; 
			   //System.out.println("JHZIF "+jahrhundertziffer);

			   int wochentag;														
			   wochentag = (tagesziffer+aMonatsziffer+jahresziffer+jahrhundertziffer+sjahr) % 7;
			   						//Alle Werte zusammenrechnen und mit
				
														
			int tage = 0;

		        switch(monat)
		        {
		        case 12:
		        	tage += 30;
		        case 11:
		        	tage += 31;
		        case 10:
		        	tage += 30;
		        case 9:
		        	tage += 31;
		        case 8:
		        	tage += 31;
		        case 7:							//Switch zwischen den 12 Monaten
		        	tage += 30;
		        case 6:
		        	tage += 31;
		        case 5:
		        	tage += 30;
		        case 4:
		        	tage += 31;
		        case 3:
		        	tage += 28;
		        case 2:
		            tage += 31;
		        case 1:
		            tage += tag;
		        }
		        
		      kw = 0;
		       
		        if (tage % 7 < 3)
		         { 
		        	kw = tage/7 ;			//Berechnungen zur Kalenderwoche
		         } 
		        
		        else if(tage%7>3)
		          {
		            kw = (tage-1)/7+1 ;
		          }								//Modulo 7 den Wochentag bestimmen
			
		        
				   switch (wochentag) 
					  {
						case 0:
							weekday ="Sonntag";
							break;
					case 1:
						weekday ="Montag";
							break;
					case 2:
						weekday ="Dienstag";
							 break;															      
						case 3:
							weekday ="Mittwoch";
							break;	
						case 4:
							weekday ="Donnerstag";
							break;
						case 5:
							weekday ="Freitag";
							break;
						case 6:
							weekday ="Samstag";
							break;
					 }
				}
      }
   }
  }
}
 

////////////////////////////////////////////////////////



public void TerminBearbeitung()     {
	
	String x;
	Scanner src = new Scanner ( System.in);
	
	
	  System.out.println("\n+---------------------------------------------------------------+");
	  System.out.println("Was genau möchten Sie bearbeiten?");
	  System.out.println("Um den Namen Ihres Termines zu bearbeiten, drücken Sie 'n'");
	  System.out.println("Um das Datum Ihres Termines zu bearbeiten, drücken Sie 'd'");
	  System.out.println("Um die Uhrzeit Ihres Termines zu bearbeiten, drücken Sie 'u'");
	  System.out.println("Um die Beschreibung Ihres Termines zu bearbeiten, drücken Sie 'b'");
	  System.out.println("\n+---------------------------------------------------------------+");
    x = src.next();
    
    if (x.equals("n"))
     	{
    		System.out.println("\nGeben Sie einen neuen Namen für Ihren Termin ein.");
    		this.n = src.next();
     	}
    
    else if (x.equals("d"))
      {
    	System.out.println("\nGeben Sie ein neues Datum für Ihren Termin ein.");
    	
    	System.out.println("\nGeben Sie zunächst einen neuen Tag ein.");
    	this.tag = src.nextInt();
  	
    	System.out.println("\nGeben Sie nun ein neues Monat ein.");
    	this.monat = src.nextInt();
  	
    	System.out.println("\nGeben Sie nun noch ein neues Jahr ein.");
    	this.jahr = src.nextInt();
      }
    
    
    else if (x.equals("u"))
      {
  	     
    	System.out.println("\nGeben Sie eine neue Uhrzeit für Ihren Termin ein.");
    	
    	System.out.println("\nGeben Sie zunächst eine neue Stunde ein.");
    	this.stunde = src.nextInt();
  		    	
    	System.out.println("\nGeben Sie nun einen neuen Wert für die Minuten ein.");
    	this.minute = src.nextInt();
      }
    
    else if (x.equals("b"))
      {
    	System.out.println("\nGeben Sie eine neue Beschreibung für Ihren Termin ein.");
    	this.b = src.next();
      }
      
}

/////////////////////////////////////////////////////////



public String toString()
   {             //Array toString Methode

	 return  "\nName Ihres Termines: " + n + 
			 "\nDatum Ihres Termines: " + String.format("%02d.%02d" ,this.tag ,this.monat) +"." + this.jahr + 
			 "\nUhrzeit Ihres Termines: " + String.format("%02d:%02d" , stunde , minute)  + " Uhr" +
			 "\nBeschreibung Ihres Termines: " + b +  
	 		 "\nKalenderwoche Ihres Termines: " + String.format("%02d" ,this.kw) +
	 		 "\nWochentag Ihres Termines: " + this.weekday +"\n";
   }	


public String toString1()
	{             //Array toString Methode

	 return  "\nName Ihres Termines: " + n + 
			 "\nDatum Ihres Termines: " + String.format("%02d.%02d" ,this.tag ,this.monat) +"." + this.jahr + 
			 "\nUhrzeit Ihres Termines: " + String.format("%02d:%02d" , stunde , minute)  + " Uhr" +
			 "\nBeschreibung Ihres Termines: " + b +"\n" ;  
	 		 
	}

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

Vielen Dank schon mal vorab =)=)
 
Zuletzt bearbeitet:

Phash

Top Contributor
na du speicherst das ganze in eine Datei, und liest zu beginn die Datei wieder ein.

in der Klasse, in der du deine Terminliste hast, liest du die Datei ein
Pruefe aber, ob die Klasse da ist - wenn sie nicht da ist, dann lies auch nichts ein

einlesen kannst du sie mit einem FileReader / bufferedFileReader.

dann musst du es zeilenweise einlesen und die Zeilen parsen und neue TerminObjekte erstellen und diese in deine Terminliste einfuegen

btw. Variablen bitte immer lowerCamelCase schreiben (pruefen) ist bei dir (Pruefen)
 
Zuletzt bearbeitet:

Luggioh

Mitglied
ja das is eben mein problem. ich weis nicht wie ich das einlese bzw wo ich diese ganzen befehle hinschreiben soll ?
habs scho paar mal ausprobiert aber iwie tut sich da nix -.- ich kanns als text zum beispiel zwar abspeichern (data.txt) aber einlesen kann ichs einfach net -..-

und das mit dem parsen und neue objekte erstellen raff ich net bzw weis ich nich wie das gehen soll ^^
 

Phash

Top Contributor
jetzt wuerde ich dir dazu raten eine Klasse zu bauen, die

TermineDao heisst

die TermineDao hat die Methoden
persistiereTermin(Termin termin)
loescheTermin(Termin termin)
holeAlleTermine();

Da du nicht jedesmal auf die Datei zugreifen magst, kriegt die Dao Klasse eine Liste mit allen Terminen.
diese wird bei der Instanziierung der Dao einmal von Platte gelesen und modifiziert die Datei jedesmal, wenn du persistiere aufrufst

Dadurch kapselst du die Speicherung von deiner Logik ab und kannst das ggf spaeter durch eine DB tauschen, ohne Logik anfassen zu muessen.
 

Luggioh

Mitglied
ok gut danke ^^
die frage is ez wiederum wie sehen die methoden denn aus ? :D
also mein problem is einfach das ich einfach nich weiß wo genau ich dieses ganze speicher zeugs denn hinschreibn soll bzw wo ichs einlesen muss??
muss ich das nur einmal am anfang machen ? oder nach jeder neuen Termineingabe ?
 

Phash

Top Contributor
deine Klasse "NeuenTerminErstellen" ist keine Klasse, sondern nur eine Methode.

Deine Klasse Terminkalender sollte die Methdoe neuenTerminErstellen() bereitstellen
in die Klasse Terminkalender gehoert auch noch eine liesDateiEin() und speichereInDatei()

in liesDateiEin() solltest du dann eben einen Filereader machen:
Zeilenweises Lesen einer Textdatei
 

Luggioh

Mitglied
ja gut mein professor meinte ich soll die Klasse TerminKalender ausdünnen, damit die main methode möglichst klein ist , deshalb ist die methode TerminErstellen auch in ner extra klasse ez^^

ok das schau ich mir mal an, aber weiß trotzdem immer noch net wo bzw wie oft oder wann ich die befehle fürs speichern dann verwende xD
 

Phash

Top Contributor
ok gut danke ^^
die frage is ez wiederum wie sehen die methoden denn aus ? :D
also mein problem is einfach das ich einfach nich weiß wo genau ich dieses ganze speicher zeugs denn hinschreibn soll bzw wo ichs einlesen muss??
muss ich das nur einmal am anfang machen ? oder nach jeder neuen Termineingabe ?

diese Frage kannst du dir selbst beantworten:

jedes schreiben auf die HDD kostet Zeit. Hast du diese Zeit?
ja, die hast du. Also schreibst du nach jedem Mal Terminanlegen auf die Platte und speicherst ihn.
Du hast sogar genug Zeit jedesmal alle Termine einzulesen.

In einer Textdatei zu speichern ist unperformant, und wird im realen Umfeld selten gemacht. Hier nimmt man eher Datenbanken, die sind dann deutlich fixer unterwegs.

Parsen.
Java:
public List<Termin> getAlleTermine(){
List<Termin> terminListe = new ArrayList<>(); //Die Liste, mit den Terminen
BufferedReader in = new BufferedReader(new FileReader("text.txt")); //der DateiReader
String zeile = null;
while ((zeile = in.readLine()) != null){ //solange es Zeilen gibt
   Termin neuerTermin = new Termin(); //mach nen neuen Termin
   termin.datum = zeile.substring(von,bis); //befuelle den Termin mit den Werten aus der Zeile
   termin.beschreibung = zeile.substring(von,bis);
   terminListe.add(neuerTermin);//fuege den Termin in die Liste ein
}
return terminListe;
}
 

Luggioh

Mitglied
btw. das mit dem filereader und das dieser dann "null" als return wert liefert soweit bin ich schon.
nur weiß ich wieder nich was genau mir das bringt ^^ weil mein array ist nach neustart trotzdem noch leer ^^
 

Luggioh

Mitglied
btw. wie würde denn ez eig die speicher methode aussehen ?
weil bei mir sieht das alles n bissl anders aus mit printwriter un so?? vllt klappts deshalb nich xD
 

Phash

Top Contributor
der filereader liest aus der datei

du parst die daten und erstellst termine in dein terminarray

das machst du jedesmal, wenn du die termine von der platte liest - am Anfang und an anderen stellen, wie du magst

das array (besser arrayList) wird mit den Terminen gefuellt.


aber mir faellt gerade ein... speicherst du terminObjekte (serialisiert) oder speicherst du text?

wenn du serialisierte Objekte speicherst musst du sie wieder deserealisieren - quasi umgekehrt zu deinem Speichern (funktioniert das? Wie sieht der Inhald deiner Datei aus?)

edit so wie es aussieht speicherst du text.

du solltest dann in die termin.txt datei Strings reinspeichern. Jeder String ist eine Zeile.
Die Zeilen sollten ein bestimmtes Format haben (CSV oder feste Breite) sonst kannst du das ja nicht wieder trennen...

bei CSV kannst du auch ergebnisString[] = string.split(";") benutzen um die Strings aufzuteilen...

ich benutze fuer sowas JSEFA (JSefa - JSefa) das ist einfach und schnell - geht aber wahrscheinlich ueber das raus was du machen magst :)

da sind aber einfache Beispiele

(eine Klasse TerminZeile erstellen, und dann annotieren wie du es brauchst die Beispiele sind super)
dann erstellst du aus einem Termin eine Terminzeile (die Klasse Termin koennte das schon anbieten, oder du baust eine TerminSpeicherLogik Klasse die das uebernimmt - in beide Richtungen.
 
Zuletzt bearbeitet:

Luggioh

Mitglied
so hab ez eine einlesen methode gemacht , un ich bekomme in meiner ausgabe ez 4mal "null" zu sehen. heißt dass das nun etwas eingelesen wurde?? mein array ist immer noch leer, stellt sich die frage wie ich nun die werte ins array kriege oO
hier meine EinLeseMethode:
Java:
package Testat;
import java.io.*;
import java.io.Serializable;

public class EinLesen implements Serializable {

	public EinLesen() throws IOException
	  {
	    BufferedReader br = new BufferedReader(new FileReader("data.txt"));

	    String zeile1 = br.readLine();
	    System.out.println(zeile1);
	    String zeile2 = br.readLine();
	    System.out.println(zeile2);
	    String zeile3 = br.readLine();
	    System.out.println(zeile3);
	    String zeile4 = br.readLine();
	    System.out.println(zeile4);

	    br.close();
	    
	 }
}
 

Luggioh

Mitglied
meine einleseMethode sieht man nun so aus:

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

public class EinLesen implements Serializable {

	public EinLesen() throws IOException
	  {
		
	    BufferedReader br = new BufferedReader(new FileReader("data.txt"));
	    String zeile = null ; 

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

ez bekomm ich in der console meine bis dahin eingegeben termine zu sehen. sie stehen nun in der text datei und werden auch eingelesen und sind gespeichert.
ez möchte ich nur noch das diese Termine die dort eingelesen werden auch in meiner arraylist dann wiederstehen, dann wäre ich nämlich fertig hehe ;);)
 

Phash

Top Contributor
poste mal eine Zeile aus deiner Datei und deine Terminklasse

dann noch was...

das einlesen ist eine Methode!
Das gehoert NICHT in den Konstruktor - auch wenn dies funktioniert.

Instanziiere die Klasse in deiner Main Methode und rufe die Methode "einlesen" auf der Instanz auf.
Erscheint ein wenig "viel" - aber sauberes Handwerk sollte man von Anfang an lernen
 

Phash

Top Contributor
Anzupassen auf deine Struktur


Java:
package de.mroedig;

import java.io.IOException;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.List;

import de.mroedig.einlesen.Einleser;
import de.mroedig.einlesen.StringNachTerminWandler;
import de.mroedig.einlesen.Termin;

public class Main {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		try {
			StringNachTerminWandler wandler = new StringNachTerminWandler();
			Einleser einleser = new Einleser();
			List<String> eingeleseneListe = einleser.einlesen();

			List<Termin> ergebnis = new ArrayList<>();

			for (String element : eingeleseneListe) {
				ergebnis.add(wandler.wandleStringInTerminUm(element));
			}

			for (Termin termin : ergebnis) {
				System.out.println(termin.getBezeichnung()
						+ termin.getDatum().toString());
			}

		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

}
Java:
package de.mroedig.einlesen;

import java.util.Date;

public class Termin {

	private String bezeichnung;
	private Date datum;

	public String getBezeichnung() {
		return bezeichnung;
	}

	public void setBezeichnung(String bezeichnung) {
		this.bezeichnung = bezeichnung;
	}

	public Date getDatum() {
		return datum;
	}

	public void setDatum(Date datum) {
		this.datum = datum;
	}

}

Java:
package de.mroedig.einlesen;

import java.text.ParseException;
import java.text.SimpleDateFormat;

public class StringNachTerminWandler {

	public Termin wandleStringInTerminUm(String eingabe) throws ParseException {

		Termin neuerTermin = new Termin();
		neuerTermin.setBezeichnung(eingabe.substring(0, 25));
		SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.YYYY");

		neuerTermin.setDatum(sdf.parse(eingabe.substring(24, 34)));
		return neuerTermin;
	}
}

Java:
package de.mroedig.einlesen;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class Einleser {

	public List<String> einlesen() throws IOException {
		BufferedReader br = new BufferedReader(new FileReader("data.txt"));
		List<String> ergebnisListe = new ArrayList<>();
		String zeile = null;
		while ((zeile = br.readLine()) != null) {
			ergebnisListe.add(zeile);
		}

		br.close();
		return ergebnisListe;
	}

}
 

Luggioh

Mitglied
ok danke ;) ich versuch des ez mal anzuwenden aber sieht ganz gut aus :p ich denk das bekomm ich hin ;) melde mich die tage nochmal ;)

dankeschön bis hierher =)
 

Luggioh

Mitglied
ok danke nochmals. hat eig alles geklappt ;)
hab ez nochmal ne andere frage und zwar:

ist es eig auch möglich anstatt das ez so zu machen mit einlesen, speichern etc... einfach die komplette arraylist einfach abzuspeichern und wieder reinzuladen ?? erscheint mir eig einfacher :D
 

Luggioh

Mitglied
ok also bei mir werden ez termine abgespeichert und auch wieder eingelesen. soweit so gut^^
nur hab ich immer noch das problem das die Termine eben nicht im Array drin sind und ich Sie somit nicht bearbeiten kann :( wenn ich das noch hinbekommen würde wäre ich fertig, aber scheinbar wird das nix mehr mit mir :D

hab ez nochmal ne andere frage und zwar:

ist es eig auch möglich anstatt das ez so zu machen mit einlesen, speichern etc... einfach die komplette arraylist einfach abzuspeichern und wieder reinzuladen ?? erscheint mir eig einfacher :D
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
HorstSchröder Speicherung des Testzeitpunkts Java Basics - Anfänger-Themen 3
A Fehler bei der Speicherung von JOptionPane-Eingaben Java Basics - Anfänger-Themen 4
N Probleme bei Speicherung eines Integer-Array in Datei speichern Java Basics - Anfänger-Themen 3
fLooojava Speicherung einer Usereingabe Java Basics - Anfänger-Themen 2
S Input/Output Datei für Speicherung von Variablen Java Basics - Anfänger-Themen 5
GianaSisters Input/Output Speicherung über FTP-Problem Java Basics - Anfänger-Themen 7
Guybrush Threepwood Effizientester Datentyp zur Speicherung einer ungeordneten Menge von ints Java Basics - Anfänger-Themen 8
B Probleme bei XML-Speicherung Java Basics - Anfänger-Themen 7
N Sequentielle Speicherung Java Basics - Anfänger-Themen 2
A begrenzte Datenstruktur zur Speicherung von bytes Java Basics - Anfänger-Themen 6
F Speicherung von Werten?!? Java Basics - Anfänger-Themen 7
H Speicherung mit XML Java Basics - Anfänger-Themen 3
G Listenartige Speicherung verschiedener Objekte Java Basics - Anfänger-Themen 5
C JTable und dynamische Speicherung Java Basics - Anfänger-Themen 2
D speicherung Java Basics - Anfänger-Themen 8
E Programm zu Speicherung von Daten ---Totaler Anfänger Java Basics - Anfänger-Themen 7
G Speicherung von Referenzen auf Instanzen Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben