Speichern und Laden

petterapamm

Aktives Mitglied
Hallo!
Ich bin gerade dabei ein Programm zu schreiben, in das bei der Verwendung eine Menge Daten eingetragen werden. Dazu wäre es praktisch eine Methode einzuführen, die das Speichern von Variablen in eine Datei und Laden dieser Einträge erlaubt. Diese Einträge sind boolean-Werte, doubles und Strings.
Ich habe schon versucht mich etwas zu informieren, bin aber noch nicht so sehr weit gekommen:
Ich weiß, dass das Speichern irgendwie mit FileOutputStream() funktioniert und das Laden mit FileInputStream(). Desweiteren hab ich noch von den Methoden write() (o.ä.), flush() und close() gehört, die man am Ende des Speichervorgangs braucht, damit die Datei geschrieben (write) und das Speichern abgeschlossen wird.
Jedoch verstehe ich nicht, was jetzt genau getan werden muss, damit Dateien ausgegeben und wieder ausgelesen werden können.

MfG,
petterapamm

PS.: Ich bin mir nicht sicher, ob dies wirklich ein Java-Einsteiger-Thema ist, aber ich fühle mich noch so als Anfänger, dass ich glaube in diesem Forenabschnitt richtig zu sein.
 
propertiesdatei, datenbank, serialisierung. such dir was aus und google danach 🙂 (bzw. wir könnten dir ein kleines bsp zeigen)

die einstellungen einfach so in eine datei zu schreiben, ist imho nicht so schön aber streams wirst du definitiv brauchen - da bist du schon auf dem richtigen weg 😉
 
Bin selbst auch grad dabei, mit Head First Java Serialisierung zu lernen.
Wichtig: soweit ich das bis jetzt verstanden habe, geht es bei Serialisierung darum, den Zustand von Objekten abzuspeichern. Wie es bei primitiven Datentypen aussieht (da du sagtest, du wolltest u.a. booleans und doubles abspeichern…), weiß ich nicht. … wobei du diese auch theoretisch mithilfe ihrer Wrapper-Klassen in Objekte packen könntest… *überleg*
Hier mal ein kleines kommentiertes Code-Beispiel in Anlehnung an den Beispielcode im Buch, mit OutputStreams und dergleichen, vielleicht hilft es dir ja 🙂:

Java:
import java.io.Serializable;

public class GameCharacter implements Serializable {
	String name;
	final String RACE;
	int age;
	
	public GameCharacter(String name, String RACE, int age) {
		this.name = name;
		this.RACE = RACE;
		this.age = age;
	}
	
	String getName() {
		return name;
	}
	
	String getRace() {
		return RACE;
	}
	
	int getAge() {
		return age;
	}
}

Java:
import java.io.*;

public abstract class GameCharacterTestDrive {
	
	public static void main(String[] args) {
		
		//create a game character
		GameCharacter alice = new GameCharacter("Alice", "Human", 45);
		System.out.println("Alice is now "+alice);
		System.out.println("Alice is of race "+alice.getRace());
		
		//write the character's data to a file
		try {
			ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream("Alice.ser"));
			os.writeObject(alice);
			os.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
		//set the reference to null
		alice = null;
		System.out.println("Alice is now "+alice);
		
		//get the data back
		try {
			ObjectInputStream is = new ObjectInputStream(new FileInputStream("Alice.ser"));
			alice = (GameCharacter) is.readObject();
			System.out.println("Alice is now "+alice);
			System.out.println("Alice's age is "+alice.getAge());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
 
ich fass dir das mal noch kurz zusammen:

wenn du Objekte speichern willst, nimm Serialisierung (siehe haave). Wenn du Objekte speichern willst und auch Änderungen der EInstellungen ausserhalb des Programmes vornehmen möchtest, nimm xml-serialisierung. wenn du tabellarische Daten speichern willst, nimm eine Datenbank. Wenn du einfach paar booleans, Strings, whatever speichern willst, nimm eine Properties-Datei.
 
Kann es sein, dass in der Properties-Datei nur String-Variablen gespeichert werden können? Wenn ich versuche, den Inhalt einer Variable der Properties-Datei z.B. mit einer int-Variable gleichzusetzen, sagt BlueJ mir, dass der ausgelesene Wert ein String ist und es deswegen nicht funktioniert. Das einzige was Google mir als Lösung gebracht hat ist konvertieren von Strings in Integer, was ich aber irgendwie unschön finde. Soll ich vielleicht doch lieber Serialisierung verwenden?
 
Kann es sein, dass in der Properties-Datei nur String-Variablen gespeichert werden können?
Genau, logischerweise kannst Du nur Text schreiben, da es nur eine in ISO-8859-1 kodierte Textdatei ist. Das macht sie auch einfach und angenehm.

Falls Du die einfachen Parser‐Methoden noch nicht kennen solltest, hier sind sie: Boolean.parseBoolen(String) und Integer.parseInt(String).
 
Mir fällt dazu folgende vorgehensweise ein:

du speicherst deine objekte erstmal in einem Vector Container oder einer List. Danach Speicherst du diesen Container / List per BufferedWriter zeile für zeile über eine for schleife in deine datei.

Dann hastu die datei

so , einlesen tust du das ganze wieder per BufferedWriter zeile für zeile. Dann hastu einen Sogenannten CSV String , das heisst alles hängt in einem string , den es nun zu teilen gilt. Hierfür schlage ich dir einen StringTokenizer vor , mit dem kannstu dann den CSV String wieder auf deine Variablen einlesen. Dann legstu das ganze einfach wieder per For Schleife datensatz für datensatz in deinen Vector / Deine List ein. Arbeiten tust du dann die ganze zeit mit den Vektoren / Listen , und speicherst am besten nach allen änderungne , sonst kann es zu relativ krassen datenlaufzeitfehler mit datenverlust führen

Alles wissenswerte zu dem oben genannten findest du zB im Galileo Openbook : Java ist auch eine Insel 8

Viel spass mit dem genannten

übrigens habe ich mit dem oben genannten eine Mediathek mit kunden , medien und verleihdatenbank auf txt ebene umgesetzt.

Hierbei musstu beachten : du musst für jeden datensatz den gleichen aufbau haben 🙂
 

Zurück
Oben