# Speichern - Java-Datenbank, Textdatei oder wie?



## Exodus155 (23. Mai 2007)

Hallo,

Was soll ich verwenden damit ich daten auf meiner festplatte speichere und mein programm aufruft? Also möchte dass ganze verschlüsselt machen, weil ich mein programm so gestalten will, dass wenn dass programm gestartet wird eine passwortabfrage kommt, um überhaupt in mein programm hineinzukommen! Datenbank is mir schon klar, aber welcher? wisst ihr was ich meine?

MFG
Exodus


----------



## DP (23. Mai 2007)

oracle sollte imo der aufgabe gewachsen sein.


----------



## Guest (24. Mai 2007)

DP hat gesagt.:
			
		

> oracle sollte imo der aufgabe gewachsen sein.


----------



## L-ectron-X (24. Mai 2007)

Ich glaube, dieser Aufgabe ist fast jede Datenbank gewachsen. Für nicht so geeignet halte ich MS Access.


----------



## Exodus155 (24. Mai 2007)

Ich weiß nicht ob ihr mich richtig versteht! also wenn ich z.b.: ein spiel installiere und spiele wo werden dann die saves gespeichert? NAME usw....

MFG
Exodus


----------



## AlArenal (24. Mai 2007)

Exodus155 hat gesagt.:
			
		

> Ich weiß nicht ob ihr mich richtig versteht! also wenn ich z.b.: ein spiel installiere und spiele wo werden dann die saves gespeichert? NAME usw....



Da wo der Entwickler es hinhaben wollte.

Ich glaube viel eher du kannst nicht ausdrücken was du sagen willst.


----------



## nebulo (24. Mai 2007)

Verstehe ich dich richtig du willst praktisch nur Spielstände speichern? Da wäre eine Datenbank sicher etwas übertrieben.

Warum willst du das ganze überhaupt verschlüsseln?


----------



## DP (24. Mai 2007)

einfach ne "billige" textdatei nehmen, lesen/schreiben + ver-/entschlüsselung und feierabend.

weiss nicht was es da großartig zu lamentieren gibt.

gecrackt werden kann jede software...


----------



## Exodus155 (24. Mai 2007)

Also ich hab ein programm geschrieben! soweit so gut! Hab in dem programm drinnen Textfelder wo ich namen eingeben kann! wo kann ich die namen dann abspeichern? welche datei? soll ich eine tabelle verwenden?

MFG
Exodus


----------



## L-ectron-X (24. Mai 2007)

Du kannst die Eingaben bspw. auch in einer Datei serialisieren. Das ist einfach, schnell und elegant.


----------



## Guest (25. Mai 2007)

Einfach serialisieren/deserialisieren ist für sowas gut geeignet, wie bereits gesagt
	
	
	
	





```
// Stream zum Lesen
ObjectInputStream in = new ObjectInputStream(new InflaterInputStream(new BufferedInputStream(new FileInputStream(file))));
// Stream zum Schreiben
ObjectOutputStream out = new ObjectOutputStream(new DeflaterOutputStream(new BufferedOutputStream(new FileOutputStream(file))));
```


----------



## Exodus155 (1. Jun 2007)

So habs ausprobiert! keine chance weiß nicht was ich mit inputstream machen soll! also hab textfelder! wenn ich OK drücke, dann soll es abgespeichert werden die textfelder wo ich vorher was hineinschreib.

MFG
Exodus


----------



## L-ectron-X (1. Jun 2007)

Du liest vor dem Serialisieren die Textfelder aus und speicherst sie in Strings oder einem String-Array, welche du wiederum serialisierst. Deserialisierung ist ähnlich einfach.

Ich habe mir mal vor längerer Zeit eine eigene Klasse zum (De)Serialisieren geschrieben.

```
/**
 * Serializer.java
 * @author  L-ectron-X
 */
public class Serializer {
    
    /**
     * Serialisiert ihr übergebene Objekte in einer Datei mit einem ihr
     * übegebenen Dateinamen.
     * @param filename Der (absolute) Dateiname der zu speichernden Datei.
     * @param data Das zu serialisierende Objekt.
     * @return true wenn erfolgreich, sonst false.
     */
    public static boolean serialize(String filename, java.io.Serializable data) {
        try {
            java.io.ObjectOutputStream oos = new java.io.ObjectOutputStream(
                new java.io.FileOutputStream(new java.io.File(filename)));
            
            oos.writeObject(data);
            oos.close();
        }
        catch(java.io.NotSerializableException nse) {
            nse.printStackTrace();
            return false;
        }
        catch(java.io.IOException ioe) {
            ioe.printStackTrace();
            return false;
        }
        return true;
    }
    
    /**
     * Deserialisiert ein aus einer Datei gelesenes serialisiertes Objekt.
     * @param filename Der (absolute) Dateiname der zu lesenden Datei.
     * @return Object - das deserialisierte Objekt.
     */    
    public static Object deserialize(String filename) {
        Object object = null;
        try {
            java.io.ObjectInputStream ois = new java.io.ObjectInputStream(
                new java.io.FileInputStream(new java.io.File(filename)));
            
            object = ois.readObject();
            ois.close();
        }
        catch(java.io.IOException ioe) {
            ioe.printStackTrace();
            return null;
        }
        catch(ClassNotFoundException cnfe) {
            cnfe.printStackTrace();
            return null;
        }
        
        return object;
    }
}
```

Damit wäre eine (De)Serialisierung auf eine kurze Zeile begrenzt.
z.B.
	
	
	
	





```
Serializer.serialize("Textfeldeingaben.ser", meinStringArray);
```
oder
	
	
	
	





```
String[] eingaben = (String[])Serializer.deserialize("Textfeldeingaben.ser");
```


----------



## Exodus155 (1. Jun 2007)

Hm ok! ähm und wie soll ich dass jetz integrieren?


----------



## Exodus155 (1. Jun 2007)

```
import java.awt.Container;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;

public class test
{
	public static void main (String[] args)
	{
		JFrame f1 = new JFrame("EXODUS155"); 
		f1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		Container c = f1.getContentPane();
		c.setLayout(null);
		
		JTextField jf1 = new JTextField();
		jf1.setBounds(0,0,100,30);	
		f1.add(jf1);
		
		JButton jb1 = new JButton("OK");
		jb1.setBounds(0,30,100,30);
		f1.add(jb1);
		
		f1.setResizable(false); 
		f1.setSize(0, 100);  
		
		f1.setVisible(true);
		
	}
}
```
So hab jetz ein kleines programm.

Wenn ich OK drücken will dann soll dass was ich in das textfeld hineingeschrieben habe in ind die test datei geschrieben werden, damit ich sie dann wieder auslesen kann!

p.s.: OK funktioniert mit Actionlistener! Hab ich jetz nicht integriert in dass programm!

MFG
Exodus


----------



## L-ectron-X (1. Jun 2007)

Hast du schon mal mit mehr als einer Klasse gearbeitet?
Weißt du wie man Inhalte aus Textfeldern ausliest?

Wenn du nur mit einem Textfeld arbeitest kann dein Code der actionPerformed()-Methode so aussehen:

```
String str = jf1.getText(); //Textfeld auslesen
boolean success = Serializer.serialize("Testdatei.ser", str); //Objekt serialisieren
if(success) {
   jf1.setText(""); // Feld leeren
   JOptionPane.showMessageDialog(null, "Speichern erfolgreich!", "Meldung", JOptionPane.INFORMATION_MESSAGE);
}
else {
   JOptionPane.showMessageDialog(null, "Speichern fehlgeschlagen!", "Meldung", JOptionPane.ERROR_MESSAGE);
}
```


Das Einlesen serialisierter Objekte würde dann so aussehen:

```
String str = (String)Serializer.deserialize("Testdatei.ser"); //Objekt deserialisieren
if(str == null) {
   JOptionPane.showMessageDialog(null, "Fehler beim Einlesen!", "Meldung", JOptionPane.ERROR_MESSAGE);
   return;
}
jf1.setText(str);
```

Um das alles in Gang zu bekommen, kopierst du meine Klasse in dein Projekt und kompilierst sie. Dann schreibst du den Code oben in die actionPerformed()-Methode des Speichern-Buttons.
Den Code unten schreibst du in die Methode des actionPerformed()-Methode des Einlesen-Buttons.

Bei der Variante mit einem Textfeld wird auch nur ein String gespeichert/wiederhergestellt. Wenn du mehrere Textfelder hast, schreibst du die Inhalte in ein String-Array und (de)serialisierst dieses.


----------



## Exodus155 (1. Jun 2007)

ähm ne weiß ich jetz grad nicht wie man textfelder in strings umwandelt kannst du mir dass nochma kurz sagen?
und hab auch nicht mit mehr als einer klasse gearbeitet! 
Bitte erklärung !! ;-)


MFG
Exodus


----------



## L-ectron-X (1. Jun 2007)

Exodus155 hat gesagt.:
			
		

> ähm ne weiß ich jetz grad nicht wie man textfelder in strings umwandelt kannst du mir dass nochma kurz sagen?


Schau dir mal den ersten Codeblock an, gleich die erste Codezeile.

Wenn dir das dann immer noch Probleme beim Verständnis bereitet, solltest du unbedingt erst mal ein paar Kapitel in einem Einsteigerbuch lesen.


----------



## Exodus155 (1. Jun 2007)

ahja mann bin ich blöd steht ja groß da!hehe ja hab das buch "JAVA IST AUCH EINE INSEL 5.te auflage"! sorry dass ich so viel frage! 

MFG
Exodus


----------



## L-ectron-X (1. Jun 2007)

Ein Forum ist zum Fragen da, nur kann ich dir hier aus Zeitmangel nicht gewisse Grundlagen in aller Ausführlichkeit beibringen. 
Mich würde auch interessieren, ob du die Sache nun zum Laufen gebracht hast.


----------



## Exodus155 (1. Jun 2007)

ja geht sehr gut! habe eine neue klasse gemacht Seiralizer und deinen code kopiert! er erstellt im gleichen ordner testdatei.ser! danke nochma! 

warum benötigt man eine eigene klasse Serializer? geht dass nich in der main class?

MFG
Exodus


----------



## L-ectron-X (2. Jun 2007)

Doch, das geht natürlich auch. Aber normale Projekte verteilen sich in mehrere Klassen und Pakete, da wäre es untypisch in mehreren Klassen die gleichen Funktionen zu implementieren.


----------



## Exodus155 (2. Jun 2007)

und was macht man so typisch in solche klassen?


----------



## Guest (12. Jul 2007)

Na das was die Klassen machen sollen...Deine Klasse macht doch auch was DU willst?
Eine andere Klasse macht dann halt was anderes... *loooooool*
Halt das was man Ihr sagt was sie tun soll....glaube Du solltest echt Mal ein Java-Buch zur Hand nehmen und bei Seite 1 anfangen...


----------

