Dateizugriff (2)

Objekte in Dateien schreiben

Nehmen wir an, Sie haben eine bescheidene kleine Klasse mit einem Attribut, einem Getter und einem Setter:


import java.io.*;

public class MeineKlasse implements Serializable {

  private String einAttribut;

  public String getEinAttribut() {
    return einAttribut;
  }

  public void setEinAttribut(String einAttribut) {
    this.einAttribut = einAttribut;
  }
}


Sie benötigen nun ein Programm, das Objekte dieser Klasse erfassen, in einer Datei abspeichern und wieder laden kann.
Hier ist es. Da die Lese-und Schreibroutine unabhängig vom Inhalt der Klasse ist, lässt es sich leicht an umfangreichere Klassen anpassen. Einzige Voraussetzung: Ihre Klasse muss die Klasse "Serializable" implementieren.


import java.util.*;
import java.io.*;

public class Objektdatei {

  public static MeineKlasse[] objektFeld = new MeineKlasse[1000];
  public static int anzahlObjekte = 0;

  public static void schreibeObjekte(MeineKlasse[] objektFeld) {
    try {
      FileOutputStream fileStream = new FileOutputStream("Meine Objekte.dat");
      ObjectOutputStream os = new ObjectOutputStream(fileStream);
      int index=0;
      while (objektFeld[index]!=null){
        os.writeObject(objektFeld[index]);
        index++;
      }
      os.close();
    } catch (IOException ex) {
      ex.printStackTrace();
    }
  }

  public static MeineKlasse[] liesObjekte() {
    int index=0;
    try {
      ObjectInputStream is = new ObjectInputStream(new FileInputStream("Meine Objekte.dat"));
      do {
        Object o = is.readObject();
        objektFeld[index] = (MeineKlasse) o;
        index++;
      } while (index<100);
      is.close();
    } catch (Exception ex) {
      anzahlObjekte = index;
    }
    return objektFeld;
  }

  static void neueObjekte() {
    String s;
    do {
      System.out.print("Ein Datensatz bitte (Ende mit x): ");
      s = Eingabe.next();
      if (!s.equals("x")) {
        objektFeld[anzahlObjekte] = new MeineKlasse();
        objektFeld[anzahlObjekte].setEinAttribut(s);
        anzahlObjekte++;
      }
    } while (!s.equals("x"));
  }

  static void zeigeObjekte() {
    if (anzahlObjekte==0) {
      System.out.println("Nichts anzuzeigen\n");
    } else {
      for (int n=0; n<anzahlObjekte; n++) System.out.println(objektFeld[n].getEinAttribut());
      System.out.println();
    }
  }

  static void löscheObjekte() {
    System.out.print("Daten wirklich löschen j/n ?");
    Scanner Eingabe = new Scanner(System.in);
    String antwort = Eingabe.next();
    if (antwort.equals("j")) {
      for (int n=0; n<anzahlObjekte; n++) objektFeld[n]=null;
    anzahlObjekte=0;
    System.out.println("Daten gelöscht\n");
    }
  }

  public static void main(String[]args) {
    System.out.println("Datensatzverwaltung\n");
    Scanner Eingabe = new Scanner(System.in);
    String antwort;
    do {
      System.out.print("1 neu 2 speichern 3 einlesen 4 anzeigen 5 löschen x Ende : ");
      antwort = Eingabe.next();
      if (antwort.equals("1")) neueObejkte();
      if (antwort.equals("2")) schreibeObjekte(objektFeld);
      if (antwort.equals("3")) objektFeld=liesObjekte();
      if (antwort.equals("4")) zeigeObjekte();
      if (antwort.equals("5")) löscheObjekte();
    } while (!antwort.equals("x"));
  }
}


Aufgaben:

  1. Erweitern Sie das Programm so, dass die Klasse mehrere Daten umfasst, z.B. einen Name und die dazugehörige Punktzahl.
  2. Schreiben Sie ein Programm, das Kontostände verwaltet.
    Es soll möglich sein
    - neue Kunden einzugeben (Kontonummer, Name, Vorname, Kontostand
    - alle Konten anzuzeigen, zu speichern, zu laden
    - Ein- und Auszahlungen vorzunehmen.