Programm speichern und später fortführen

10/17/2015 15:37 TheRealLenon#1
Hallo liebe Community,

in einem anderen Beitrag, habe ich mein erstes Programm vorgestellt und um Tipps o.ä. gebeten.

Nun Stelle ich euch eine andere Frage.

Und zwar habe ich vor, den Taschenrechner Zustand zu speichern.

Das Programm sollte eine Speicherfunktion beinhalten. Zudem sollte das Programm, sofern man am ende angekommen ist, nochmal erneut von vorne beginnen, wo ausgewählt werden kann, was man machen möchte (Taschenrechner, Lohnrechner etc..).

Es sollte die Option speichern beinhalten und die Funktion, alles zu löschen und von vorne zu beginnen (Speziell bei einer falschen Eingabe).

Wie schreibe ich diesen Code? Bitte gebt dazu auch noch gleich eine Erklärung ab, was dieser Code beinhaltet.

Vielen Dank!

Mit freundlichen Grüßen



TheRealLenon
10/17/2015 15:49 Mikesch01#2
Hallo.

Erstmal wollte ich sagen, dass du den Präfix "JS" in deinen Themen zu "Java" meiden solltest, da JS != (nicht gleich) Java ist^^

Um einen Zustand zu speichern gibt es mehrere Wege. Du kannst eine Datenbank-Verbindung benutzen und deine Daten zu persestieren. Ebenfalls könntest du über die Serialisierung der Datenobjekte oder über eine simple Anreihung von Daten (wie das CSV-Format) deine Daten in ein oder mehrere Dateien ablegen.

Um dein Programm immer wieder durchlaufen zu lassen, sollte es in einer while-Schleife laufen (Kommandozeilen-Anwendungen) oder mithilfe der GUI diese Bedienung bauen (Java-Threads).

Wie du das genau schreibst, bleibt dir überlassen. Ganz simpel wäre so ein "Menü"' über eine Switch-Anweisung in einer While-Schleife die jedes mal bei einem Durchlauf abgefragt wird
10/17/2015 16:12 algernong#3
Angenommen, du moechtest die beiden Werte, die verrechnet werden sollen sowie den Operator speichern. Dazu kannst du folgenden Code verwenden:

Erstelle eine neue Datei "CalculatorData.java" mit folgendem Inhalt:
Code:
public class CalculatorData implements java.io.Serializable {
    public int numberA;
    public int numberB;
    public char operator; // -, +, * oder /
}
Jetzt verwende folgende Methoden:
Code:
public static void store(String file, int numberA, int numberB, char operator) throws Exception {
    CalculatorData data = new CalculatorData();
    data.numberA = numberA;
    data.numberB = numberB;
    data.operator = operator;
    try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(file))) {
        out.writeObject(data);
    }
}

public static CalculatorData load(String file) throws Exception {
    try (ObjectInputStream in = new ObjectInputStream(new FileInputStream(file))) {
        return (CalculatorData) in.readObject();
    }
}
So verwendest du die Methoden:
Code:
// Programm wird beendet
store("savefile.object", numberA, numberB, operator);
Code:
// Programm wird gestartet
CalculatorData data = load("savefile.object");
int numberA = data.numberA;
int numberB = data.numberB;
char operator = data.operator;
Wenn du pruefen moechtest, ob eine Datei vorhanden ist (um zum Beispiel die Frage zu beantworten: Wurde der Zustand schon einmal gespeichert?) machst du das so:
Code:
if (new File("savefile.object").exists()) { // java.io.File stellt einige Methoden zur Verfuegung, um mit dem Dateisystem zu interagieren; zum Beispiel um zu pruefen, ob eine Datei existiert mittels exists() 
    // Datei existiert
} else {
    // Datei existiert nicht
}
Jetzt noch etwas Erklaerung:
Mit CalculatorData erstellst du eine Klasse, die eben den Zustand in den Attributen speichert. Das Interface [Only registered and activated users can see links. Click Here To Register...] will gar nicht, dass irgendwelche Methoden implementiert werden; das muss eine Klasse aber implementieren, damit sie serialisiert (= Objekte koennen irgendwo hin geschrieben und von irgendwo gelesen werden) werden kann.

Der Plan ist jetzt, die drei Werte, die gespeichert werden sollen, in ein Objekt von CalculatorData zu packen, und das Objekt dann auf die Festplatte zu speichern. Genau das macht die store Methode: Objekt anlegen, Daten in die Attribute schreiben, und dann schreibt
Code:
    try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(file))) {
        out.writeObject(data);
    }
das Objekt auf die Festplatte. Wenn du mehr ueber das Lesen und Schreiben von Daten irgendwo hin wissen willst, kannst du dir die Klassen InputStream und Unterklassen ansehen, und dazu das Design Pattern "Dekorator".

Die load Methode macht das dann umgekehrt, der Inhalt von der Festplatte wird wieder gelesen, und von Java in ein Objekt verwandelt. Von dem werden dann wieder die Attribute gelesen.

Der Vorteil von der Methode ist, dass sie recht einfach ist. Der Nachteil ist, dass du die Daten, die dann auf die Festplatte geschrieben werden (savefile.object) nicht in Notepad oder so bearbeiten kannst, wie es zum Beispiel bei XML Dateien moeglich ist.