Hallo Rene.
hier mal meine Methode die das Schreiben in die Datei
übernimmt. Das geht auch soweit. Aber wie ich das mit den
Instanzvaribalen machen soll, ist mir ein Rätsel.
Du machst es etwas umständlich:
(a) Halte es einfach
Zum einen solltest Du dem Speichern und Laden eines Objekts immer eine extra Methode spendieren und diese Aufgaben nicht in die Methode zum Hinzufügen eines neuen Knotens mit hineinmischen.
Das hält den Code einfach und verständlich und folgt dem KISS-Prinzip: „Keep it simple stupid“ 
(b) Nutze die Java-Speicherautomatik
Zum anderen übernimmt Java in den meisten Fällen das ganze Speichern und Laden der Objekte von selbst. Du musst da also nicht selbst Hand anlegen. Das einzige, um die Speicherautomatik von Java anzustossen, ist, dass jede zu speichernde Klasse die Schnittstelle java.io.Serializable implementieren muss.
Du fügst also jeder zu speichernden Klasse in der class-Zeile die 2 Wörtchen implements Serializable hinzu. Dann kannst Du sie per ObjectOutputStream.writeObject(deinSpeicherbaresObjekt) speichern und per ObjectInputStream.readObject wiederherstellen.
Damit es nicht zu abstrakt bleibt, hier der korrigierte Code:
import java.io.\*;
// Ein Knoten einer verketteten Liste
class Knoten implements Serializable {
public Knoten naechstes = null; // zu Beginn hat ein Knoten keinen Nachfolger
public Object element = null; // und keinen Inhalt
public Knoten(Object obj) {
// neuen Inhalt zuweisen:
element = obj;
}
}
// Eine verkettete Liste
public class Kette implements Serializable {
public Knoten kopf = new Knoten("kopf");
public Knoten ende = new Knoten("ende");
public Kette() {
kopf.naechstes = ende;
ende.naechstes = null;
}
// fügt das gegebene Objekt als neuen Knoten hinter den Knoten vorgaenger ein
public void fuegeNach(Knoten vorgaenger, Object neuObj) {
if ( (vorgaenger == null) || (vorgaenger == ende) ) {
throw new RuntimeException("Vorgänger darf nicht null oder das Ende der Liste sein");
}
// Objekt in neuen Knoten packen:
Knoten neuKnoten = new Knoten(neuObj);
// und diesen Knoten zwischen Vorgänger und dessen alten Nachfolger einfügen:
// (a) der Nachfolger des Vorgängers wird Nachfolger des neuen Knotens
neuKnoten.naechstes = vorgaenger.naechstes;
// (b) der neue Knoten wird zum Nachfolger des Vorgängers
vorgaenger.naechstes = neuKnoten;
}
// entfernt den Nachfolger des Knotens vorgaenger aus der Liste
public void entferneNach(Knoten vorgaenger) {
if ( (vorgaenger == null) || (vorgaenger == ende) ) {
throw new RuntimeException("Vorgänger darf nicht null oder das Ende der Liste sein");
}
Knoten loeschKnoten = vorgaenger.naechstes;
if (loeschKnoten == null) {
throw new RuntimeException("Vorgänger hat keinen Nachfolger, der gelöscht werden kann");
}
// den zu löcshenden Knoten aus der Liste entfernen (=überspringen):
vorgaenger.naechstes = loeschKnoten.naechstes;
}
// gibt die aktuelle Kette am Bildschirm aus
public void ausgeben() {
System.out.println(toString());
}
// gibt einen String mit dem aktuellen Objektinhalt zurück
public String toString() {
StringBuffer sb = new StringBuffer();
// gebe den Hash-Code des Objekts mit aus, um die
// verschiedenen Instanzen voneinander unterscheiden
// zu können:
sb.append("Kette@").append(Integer.toHexString(this.hashCode())).append("[\n");
Knoten aktuellerKnoten = kopf;
// Liste von Anfang bis Ende durchlaufen:
for (int i=0; aktuellerKnoten!=null; i++) {
sb.append("Knoten ").append(i).append(": ").append(aktuellerKnoten.element).append("\n");
aktuellerKnoten = aktuellerKnoten.naechstes;
}
sb.append("]");
return sb.toString();
}
// speichert die aktuelle Kette in einer Datei
public void speichern(String sDateiname) throws Exception {
// siehe http://java.sun.com/j2se/1.5.0/docs/api/java/io/ObjectOutputStream.html
FileOutputStream fos = new FileOutputStream (sDateiname);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(this);
oos.close();
}
// lädt eine Kette aus einer mit writeObject gesicherten Datei
public static Kette laden(String sDateiname) throws IOException, ClassNotFoundException {
FileInputStream fis = new FileInputStream (sDateiname);
ObjectInputStream ois = new ObjectInputStream (fis);
Kette kette = (Kette)ois.readObject();
ois.close();
return kette;
}
// erzeugt eine verkette Liste, speichert sie in einer Datei und
// lädt sie wieder aus der Datei
public static void main(String[] params) throws Exception {
Kette liste = new Kette();
liste.fuegeNach (liste.kopf, "Nr. 3, reg' Dich nicht so auf sonst fliegst Du!");
liste.fuegeNach (liste.kopf, "Ruhe da oben, ich muß mich konzentrieren!");
liste.fuegeNach (liste.kopf, "Huhu Nr. 1, ich stehe gleich unter Dir...");
liste.fuegeNach (liste.kopf, "Horridö, ich bin Element Nr. 1");
System.out.println ("\*\*\* Speichere verkettete Liste");
liste.ausgeben();
String sDateiname = "kette.bin";
liste.speichern(sDateiname);
Kette wiederhergestellteListe = Kette.laden(sDateiname);
System.out.println ("\*\*\* Wiederhergestellte verkettete Liste");
wiederhergestellteListe.ausgeben();
}
}
Gruß,
-Andreas.