# Speichern in Java



## Mnemosine (7. Juni 2007)

Hallo

könnte mir vieleicht jemand sagen wie ich mit Java etwas z.B. einen Array voll mit infos Speichern kann.

Danke!


----------



## VanillePudding (8. Juni 2007)

Es gibt mehrer Möglichkeiten Daten zu speichern:

Man kann zum Beispiel Daten als .txt Datei speichern:
Wird hier erklärt:
http://www.tutorials.de/forum/java/275850-array-eine-txt-schreiben.html#post1427122

Eine andere Möglichkeit ist die Serialisierung:

```
public void serialize(File file)
	{
		try {
			ObjectOutputStream os = new ObjectOutputStream(
			        new FileOutputStream(file));
			os.writeObject(deinZuSerialisierendesObjekt); 
//Achtung: Objekte können nur dann serialisiert werden wenn sie das Interface "Serializable" implementieren
			os.close();
		}
		catch (FileNotFoundException e1) {
			e1.printStackTrace();
		}
		catch (IOException e1) {
			e1.printStackTrace();
		}
	}
```

Um eine serialisierte Datei zu laden muss man folgende Methode schreiben:


```
public boolean deserialize(File file)
	{
		ObjectInputStream is;
		try {
			is = new ObjectInputStream(new FileInputStream(file));
			datenFeld = (Typ des Datenfeldes) is.readObject();
			is.close();
			return true;

		}
		catch (FileNotFoundException e1) {
			e1.printStackTrace();
			return false;
		}
		catch (IOException e1) {
			e1.printStackTrace();
			return false;
		}
		catch (ClassNotFoundException e) {
			e.printStackTrace();
			return false;
		}
```

Serialisierte Dateien kann man natürlich nur mithilfe von Java deserialisieren, während txts anderwärtig natürlich weiterverwendet werden können.


----------



## Mnemosine (8. Juni 2007)

Danke aber ich habe noch ein paar fragen confused:

Was muss ich eigentlich importieren damit es funktioniert und wie Lade ich dan die Datei wenn ich sie als .txt speichere?

Danke


----------



## VanillePudding (8. Juni 2007)

Das Array speichern:

```
public void save(File file)
	{
		try {
			BufferedWriter writer = new BufferedWriter(new FileWriter(file));
                        for (int i = 0; i < array.length; i++) {
                                   writer.write(array[i] + ";");
			writer.close();
		}
		catch (IOException e) {
			e.printStackTrace();
		}
	}
```

Das Array wieder laden:

```
public boolean load(File file)
	{
		BufferedReader reader;
		try {
			reader = new BufferedReader(new FileReader(file));
			String zeile = reader.readLine();
			while (zeile != null) {
                                  String[] values = zeile.split(";");
             //Hier hast du jetzt alle deine Werte drinnen, jetzt
             //kannst du sie wieder einfügen z.B:
                                  for (int i = 0; i < values.length; i++) {
                                  array[i] = Integer.parseInt(values[i]);
                                  }
             //So würde die Lösung für ein gespeichertes Array mit ints aussehen
             //Die Variable array muss natürlich dein datenfeld sein, in das du laden möchtest
                         }
             }
}
```

Um das ganze zum laufen zu bringen musst du noch


```
import java.io.*;
```

diese Importanweisung schreiben.


----------



## Mnemosine (8. Juni 2007)

Danke
 aber jetzt sagt er mir das ein int nicht gespeichert werden darf. Das ist genau was er sagt:
speichernundladen.
*java:32:9: save(java.io.File) in speichernundladen cannot be applied to (int)*


----------



## VanillePudding (8. Juni 2007)

Poste doch bitte einfach mal deinen Code, vielleicht kann ich dir dann besser helfen, und schreib bitte dazu was du speichern möchtest.


----------



## Mnemosine (8. Juni 2007)

Ich habe in leicht vereinfacht, hier ist er:

```
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.io.*;

public class speichernundladen extends Applet implements ActionListener {

   TextField nummerFeld;
   String text = "";
   int nummer = 0;

    public void init() {
     nummerFeld = new TextField("1");
     nummerFeld.addActionListener(this);
     add(nummerFeld);
    }

    public void actionPerformed(ActionEvent event){
       nummer = Integer.parseInt(nummerFeld.getText());
       save(nummer);
       repaint();
    }

 public void save(File file)
  {
    try {
      BufferedWriter writer = new BufferedWriter(new FileWriter(file));
      for (int i = 0; i < array.length; i++) {
        writer.write(array[i] + ";");}
      writer.close();
    }
    catch (IOException e) {
      e.printStackTrace();
    }
  }
}
```

man gibt eine Zahl ein und die wird gespeichert.


----------



## limago (9. Juni 2007)

Hi,

Applets laufen in einer sogenannten Sandbox. Das heisst der SecurityManager ist aktiv. Wenn Du ihn nicht konfigurierst, darfst Du Sicherheitsrelevante Befehle nicht ausführen. Dazu gehören z.B. Dateizugriffe. Ein Applet könnste sonst unbemerkt die Platte scannen und die Daten verschicken. 

Du hast mehrere Möglichkeiten

1. Sicherheitseinstellungen ändern. Geht aber nur auf der Clientseite und ist bei Applets deshalb ungeeignet.

2. Schreib Deine Daten in ein Cookie
http://www.rgagnon.com/javadetails/java-0180.html

3. Baue irgendeine Verbindung zum Server auf und speichere die Daten dort.

Gruss


----------



## VanillePudding (9. Juni 2007)

> nummer = Integer.parseInt(nummerFeld.getText());
> save(nummer);



Da liegt der Fehler:

die speichern Methode braucht als Parameter eine File, in die geschrieben werden soll, du hast hingegen den int nummer verwendet.

ersetz mal die 2 Zeilen durch das hier:

```
nummer = Integer.parseInt(nummerFeld.getText());
JFileChooser chooser = new JFileChooser();
int returnVal = chooser.showSaveDialog(chooser.getParent());
if (returnVal == JFileChooser.APPROVE_OPTION) {
       File file = chooser.getSelectedFile();
       save(file, nummer);
}
```

Hier kannst dfu mithilfe des FileChoosers die Datei auswählen in die du speichern möchtest. 

natürlich müssen wir die save Methode selber anpassen.


```
public void save(File file, int zuSpeichern)
{
try {
BufferedWriter writer = new BufferedWriter(new FileWriter(file));
writer.write(zuSpeichern);
writer.close();
}
catch (IOException e) {
e.printStackTrace();
}
}
```


Ich hoffe jetzt klappt alles.


----------



## Mnemosine (9. Juni 2007)

Jetzt funktioniert es fast, er kann nur JFileChooser nicht identifizieren.
Was mus ich importieren? und noch etwas unter wechen namen Speichert er die datei?

Danke


----------



## VanillePudding (9. Juni 2007)

Oh sorry:


```
import java.swing.*;
```
um gleich alle Komponenten, wie auch den JFileChooser, zu importieren
oder einzeln:

```
import java.swing.JFileChooser;
```

er speichert die Datei so ab, wie du sie im JFileChooser benannt hast.


----------



## Mnemosine (9. Juni 2007)

Er sagt mir jetzt diese Package existiert nicht,  von wo muss ich sie Runterladen?

Danke im voraus


----------



## VanillePudding (9. Juni 2007)

Ich benutze jre1.6.0_01

hol dir das neueste Java Runtime Environment von http://www.sun.com


----------



## Schnacki (10. Juni 2007)

Probier mal:

```
import javax.swing.*;
```


----------



## Mnemosine (10. Juni 2007)

Ok jetzt klapt es. Aber wo sahe ich ihm wo er speichern soll?

Danke für die Geduld.


----------

