# daten dauerhaft speichern



## iTobi (29. Aug 2009)

ich hab ma ne frage:

gibt es ne möglichkeit daten dauerhaft zu speichern? (beispielsweise einträge in textfelder o.ä.)

ich hab zwar schon von sowas wie datenbanken gehört und hab versucht mich über zig büchern und artiklen :rtfm: in das thema reinzuarbeiten aber da is soviel dabei was ich nich verstehe und deshalb wende ich mich an euch in der hoffnung das mir jemand möglichst einfach erklären kann was ich wie tun kann/soll um was zu speichern.


----------



## ARadauer (29. Aug 2009)

mhn vielleicht Dateien?

Es kommt drauf an, wie viel du genau speichern willst und was die Verwendung íst...

beschreib mal genauer was du vor hast...


----------



## iTobi (29. Aug 2009)

naja ich hab ne gui mit 8 textfeldern, in die 2mal ein string und rest double soll, das ganze würde ich gerne speichern und später wieder öffnen können

es geht um eine see simulation (siehe Thema: String array nacheinander ausgeben), und dabei muss man daten eingeben wie z.B. das volumen des sees, das abflussvolumen der stadt, (oder einwohnerzahl, weiß nich mehr genau welche version ich reingestellt ahb),....

diese daten würd ich gerne speichern und dann später wieder öffnen um nich immer wieder was es selbe eingebn zu müsssen, das nervt auf die dauer


----------



## ARadauer (29. Aug 2009)

ich würde das einfach als klartext in eine Datei speichern... eine Datenbank scheint mir hier zu übertrieben... 

vielleicht auch java.util.Properties verwenden.. falls du dabei Probleme hast, meldest dich einfach wieder...


----------



## iTobi (29. Aug 2009)

ne datenbank wollt ich eigentlich überhaupt nicht, wusste nur keine andere möglichkeit.. :bahnhof:


----------



## Wortraum (29. Aug 2009)

iTobi hat gesagt.:


> gibt es ne möglichkeit daten dauerhaft zu speichern? (beispielsweise einträge in textfelder o.ä.)


Eine Festplatte kommt mir da als erstes in den Sinn.  Wie Du das speicherst, bleibt dann Dir überlassen und hängt davon ab, was genau Du benötigst. Das kann, wie Du schon schreibt, in einer Datenbank sein, simpel als Textdatei oder in einem eigenen Format. Man kann auch mit ObjectOutputStream ein Objekt speichern.

Beispiele:
Ein serialisierbares Objekt schreiben:

```
FileOutputStream fileOut = new FileOutputStream("sicherung.ser");
ObjectOutputStream objectOut = new ObjectOutputStream(fileOut);
objectOut.writeObject(anObject);
objectOut.close();
```

Daten UTF-8-kodiert in eine Textdatei schreiben:

```
FileOutputStream out = new FileOutputStream("sicherung.txt");
OutputStreamWriter writer = new OutputStreamWriter(out, "UTF-8");
writer.write(textField.getText());
writer.close();
```

Daten im Standardzeichensatz des Systems in eine Textdatei schreiben (solange Daten nicht auf andere Systeme übertragen werden müssen, ist das in Ordnung, allerdings finde ich einen festen Zeichensatz besser):

```
FileWriter writer = new FileWriter("sicherung.txt");
writer.write(textField.getText());
writer.close();
```


----------



## iTobi (30. Aug 2009)

ok, wie kann ich die daten dann wieder aufrufen?


----------



## Gastredner (30. Aug 2009)

Kommt darauf an - entweder Deserialisieren oder die Textdateien einlesen und die Ergebnisse auswerten.
Das Auslesen von Dateien wird ausführlich in diversen Büchern behandelt, z. B. der Insel.
Das Deserialisieren von Objekten wird u. A. auch in der Insel, jedoch auch in der API selbst erläutert:

```
FileInputStream fis = new FileInputStream("t.tmp");
ObjectInputStream ois = new ObjectInputStream(fis);

int i = ois.readInt();
String today = (String) ois.readObject();
Date date = (Date) ois.readObject();

ois.close();
```


----------



## iTobi (30. Aug 2009)

ok bei der geschichte mit der textdatei, das ist exakt das was ich suche, ich hab mich ma annem testprogramm versucht:


```
import java.io.*;

class speicherntest
{
  public static void main (String args[])
  {
      Out.println("Eingabe");
      FileWriter writer = new FileWriter("sicherung.txt");
       writer.write(In.readInt());
      writer.close();
      Out.println("Ausgabe");
      if(In.readInt()==1)
      {
        //inhalt der textdatei auslesen
      }
   }
}
```

es is ganz einfach gestrickt, die eingabe aus integer werten soll gespeichert werden un nach eingabe der zahl 1 ausgegeben werden, wie sag ich dem file sicherung.txt das es geöffnet werden soll und seinen inhalt ausgegeben werden soll  (ich habs auf gut glück mit writer.open() probiert, das es nich funkts hätt ich mir zwar denken können aber ein versuch wars wert )


----------



## Wortraum (30. Aug 2009)

Mit einem FileWriter lesen? Writer – lesen – hmm.  Das Stichwort lautet FileReader und, für die anderen Beispiele, ObjectInputStream und InputStreamReader.


----------



## iTobi (31. Aug 2009)

ok das macht natürlich viel sinn, blöd von mir 

jetzt hab ich mein testprogramm erweitert:


```
import java.io.*;

class speicherntest
{
  public static void main (String args[])
  {
     try {
      Out.println("Eingabe");

            FileWriter writer = new FileWriter("sicherung.txt");
       writer.write(In.readLine());




      Out.println("Ausgabe");

         FileReader read = new FileReader("sicherung.txt");
         Out.println(read.read());



      }catch(java.io.IOException exp){ exp.printStackTrace();}
   }
}
```

aber er gibt als ergebnis immer nur -1 aus

als eingabe habe ich es mit "hallo","j",und integerwerten probiert.

wo ist der fehler?


----------



## ARadauer (31. Aug 2009)

versuch mal ein  writer.flush(); mach dem schreiben...


----------



## Wortraum (31. Aug 2009)

Oder besser noch: close(). Das gleiche für FileReader, wenn er nicht mehr benötigt wird, schließen.


----------



## iTobi (1. Sep 2009)

ok jetzt funktionierts, das problem jetzt ist nur er gibt mir scheinbar die asci nummer des ersten buchstaben aus, wie kreig ich das wieder innen buchstaben?? und kann der immer nur einen buchstaben speichern?


----------



## Leroy42 (1. Sep 2009)

iTobi hat gesagt.:


> ok jetzt funktionierts, das problem jetzt ist nur er gibt mir scheinbar die asci nummer des ersten buchstaben aus, wie kreig ich das wieder innen buchstaben??



In char umwandeln:


```
char c = asciiWert;
```



iTobi hat gesagt.:


> und kann der immer nur einen buchstaben speichern?



Nein! Wie liest du denn ein?


----------



## iTobi (1. Sep 2009)

naja wies da steht writer.write (In.readdLine())


----------



## JohannisderKaeufer (1. Sep 2009)

Schau dir erst mal sicherung.txt an. Steht da alles drin was du eingegeben hast?

read.read() liest nur einen Buchstaben ein und gibt ihn als integer aus. Bzw. -1 wenn das Ende des Streams, also der Datei erreicht sein sollte

Ergo:


```
while((int i = read.read())!=-1){
System.out.print((char)i);
}
```


----------



## iTobi (8. Sep 2009)

ok es funkts alles aber das einlesen geht auch über

```
String einlese=In.readFile("sicherung.txt")
```
das ist vielleict etwas einfacher 

danke an alle


----------

