# Werte in einer Datei speichern ?



## kaper28 (27. Jan 2009)

```
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;

public class GuiKlasse extends JFrame {
	// für das Eingabefeld
	private JTextField anzahl, wortliste;
	// für die Schaltflächen
	private JButton einlesen, beenden, speichern;
	// eine Intansvaribale für typ RamdomAccesFile
	private RandomAccessFile dateiListe;

	// die innere Klasse für den ActionListener
	class MeinListener implements ActionListener {
		@Override
		public void actionPerformed(ActionEvent e) {
			// wurde auf Lesen geklickt?
			if (e.getActionCommand().equals("lesen"))
				// dann die Datei einlesen
				datenLesen();
			if (e.getActionCommand().equals("wortSpeichern"))
				// dann die Datei einlesen

				// wurde auf Beenden geklickt?
				if (e.getActionCommand().equals("ende"))
					System.exit(0);

		}
	}

	public GuiKlasse(String titel) {
		super(titel);

		// ein GridLayout mit 2 Spalten anwenden
		setLayout(new GridLayout(0, 2));

		add(new JLabel("Wörter: "));
		wortliste = new JTextField("");
		add(wortliste);

		add(new JLabel("Nummer: "));
		anzahl = new JTextField("");
		add(anzahl);
		// die Schaltflächen
		einlesen = new JButton("Wort Ausgeben");
		einlesen.setActionCommand("lesen");
		beenden = new JButton("Beenden");
		beenden.setActionCommand("ende");
		speichern = new JButton("Speichern");
		speichern.setActionCommand("wortSpeichern");

		MeinListener listener = new MeinListener();
		einlesen.addActionListener(listener);
		beenden.addActionListener(listener);
		speichern.addActionListener(listener);
		// gibt es die Datei daten.bin schon?
		File dateiTest = new File("liste.bin");
		// wenn nicht, erstellen wir sie neu
		if (dateiTest.exists() == false)
			datenSchreiben();

		add(speichern);
		add(einlesen);
		// add(beenden);
		pack();
		setSize(300, 100);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setVisible(true);
	}

	// Die Methode zum Speichern
	private void datenSpeichern() {

	}

	// die Methode zum Lesen
	private void datenLesen() {

		int gesucht;
		// steht im Eingabefeld ein Wert?
		// sonst verlassen wir die Methode direkt wieder
		if (anzahl.getText().isEmpty())
			return;
		gesucht = Integer.parseInt(anzahl.getText());
		try {
			// für das Positionieren
			long neuePosition = 0;
			int punkte = 0;
			int treffer = 0;
			// geöffnet wird die Datei liste.bin im Nur-Lesen-Modus
			dateiListe = new RandomAccessFile("liste.bin", "r");
			// die gesamte Datei durchsuchen
			while (dateiListe.getFilePointer() < dateiListe.length()) {
				// die Punktzahl lesen
				punkte = dateiListe.readInt();
				// stimmen Punkte und Suchkriterium überein?
				if (punkte == gesucht) {
					// dann die Treffer erhöhen
					treffer++;
					// die Punkte anzeigen
					add(new JLabel(Integer.toString(punkte)));
					// den Namen lesen
					add(new JLabel(dateiListe.readUTF()));
				}
				// wenn nicht, dann den Namen überlesen
				else {
					// die Länge beschaffen
					neuePosition = dateiListe.readUnsignedShort();
					// die neue Position ansteuern
					dateiListe.seek(dateiListe.getFilePointer() + neuePosition);
				}
			}
			// wenn es keinen Treffer gab, eine Meldung ausgeben
			if (treffer == 0)
				JOptionPane.showMessageDialog(this, "Kein Treffer");
			dateiListe.close();
		} catch (IOException e) {
			JOptionPane.showMessageDialog(this,
					"Beim Laden ist ein Problem aufgetreten");
		}
		// das Fenster neu "packen"
		pack();
	}

	// die Methode zum Schreiben
	private void datenSchreiben() {
		try {
			// geöffnet wird die Datei liste.bin im Lese- und Schreibmodus
			dateiListe = new RandomAccessFile("liste.bin", "rw");
			// ein paar Werte in die Datei schreiben
			dateiListe.writeInt(1);
			dateiListe.writeUTF("Automobil");
			dateiListe.writeInt(2);
			dateiListe.writeUTF("Versuch");
			dateiListe.writeInt(3);
			dateiListe.writeUTF("Hund");
			dateiListe.writeInt(4);
			dateiListe.writeUTF("Katze");
			dateiListe.writeInt(5);
			dateiListe.writeUTF("Ziege");
			dateiListe.writeInt(6);
			dateiListe.writeUTF("Maus");
			dateiListe.writeInt(7);
			dateiListe.writeUTF("Elapfant");
			dateiListe.writeInt(8);
			dateiListe.writeUTF("Isopropylalkohol");
			dateiListe.writeInt(9);
			dateiListe.writeUTF("Schwimmbad");
			dateiListe.writeInt(10);
			dateiListe.writeUTF("Test");
			dateiListe.close();
		} catch (IOException e) {
			JOptionPane.showMessageDialog(this,
					"Beim Schreiben ist ein Problem aufgetreten");
		}

	}
}
```
Hallo Freunde, mit dieser kleinen App. kann ich die vorher gespeicherten Wörter auslesen .Nur ich möchte aber die Wörter selbst schreiben  (Textfield Wörter) und in die Datei spiechern. Wie kann ich so was machen ? Die Datei muss eine bin.datei sein.
mfg
kaper28


----------



## kaper28 (27. Jan 2009)

```
private void dateiSchreiben() {
		//eine Instanz der Klasse FileWriter
		FileWriter datei;
		try {
			//geöffnet wird die Datei daten.txt
			datei = new FileWriter("liste.bin");
			//den Inhalt aus dem Feld schreiben
			wortliste.write(datei);
			anzahl.write(datei);
			//datei zur Sicherheit ausdrücklich schließen
			datei.close();
		}
		catch (IOException e ) {
			JOptionPane.showMessageDialog(this, "Beim Schreiben ist ein Problem aufgetreten");
	    }
```

so ich habe es geschaft nur ich möchte mehr als ein wort speichern


----------



## 0x7F800000 (27. Jan 2009)

Hey, du willst doch irgendwie ganz speziell irgendwelche daten als text in eine datei schreiben, oder wie ist das jetzt?
Wieso greifst du dann auf irgendwelche mysteriösen "write"-methoden von irgendwelchen Swing-Komponenten? Ich weiß nicht, vielleicht ist das sogar oK so. Aber wenn du zweimal ein solches write() aufrufst, sollte alles was du beim ersten mal reingeschrieben hast überschrieben sein.

Warum machst du dan nicht einfach "normal", also mit einem Stinknormalen Strom in die Datei?
Du willst was schreiben => PrintStream
Das soll wohin? In die datei => FileOutputStream
Du nimmst dir einfach diesen Strom und schreibst da ganz normal zeugs rein, so wie du das mit System.out.println() machen würdest. Da würde man wohl etwas mehr davon mitbekommen, was das programm macht, als wenn man einfach alles swing überlässt.

Aber das ist jetzt nur so ein vorschlag, vielleicht gehts wirklich einfacher...
Und was sicher ist: so eine Ausgabe sollte wirklich NICHTS mehr mit der GUI zu tun haben. Den zustand der GUI zu speichern ist unsinn. daten aus dem Model speichert man normalerweise. *M V C*


----------



## kaper28 (27. Jan 2009)

Andrey hat gesagt.:
			
		

> Hey, du willst doch irgendwie ganz speziell irgendwelche daten als text in eine datei schreiben, oder wie ist das jetzt?
> Wieso greifst du dann auf irgendwelche mysteriösen "write"-methoden von irgendwelchen Swing-Komponenten? Ich weiß nicht, vielleicht ist das sogar oK so. Aber wenn du zweimal ein solches write() aufrufst, sollte alles was du beim ersten mal reingeschrieben hast überschrieben sein.
> 
> Warum machst du dan nicht einfach "normal", also mit einem Stinknormalen Strom in die Datei?
> ...


Hallo Andrey, 

ja das stimmt ich habe 10 Wörter und möchte sie in eine Datei schrieben lassen .Ja das mit dem GUI hast du recht und die methode ist auch scheiße , Aber die Lehrer möchten das so mein freund   

mit dieser Methode das ich oben geschrieben habe kann ich nur ein wort scheiben ich muß aber 10 wörter machen .Wie kann ich das ?


----------



## 0x7F800000 (27. Jan 2009)

kaper28 hat gesagt.:
			
		

> die methode ist auch scheiße , Aber die Lehrer möchten das *so*


Wie "so"? Mit JComponent.write()? Glaube ich nicht. Ich glaube viel eher, dass du momentan einer der wenigen Leute auf diesem Planeten bist, die von dieser merkwürdigen write()-methode wissen. Du hast dir da irgendwas unbrauchbares aus der dunkelsten Ecke der API herausgekramt und wunderst dich drüber, warum's zum verzweifeln ist. Mach's mit einem stinknormalen ausgabestrom ohne diesen ganzen "Component.write()" und "RandomAccessFile" Krempel, da wird dir jeder Lehrer danken...


----------



## kaper28 (28. Jan 2009)

Andrey hat gesagt.:
			
		

> kaper28 hat gesagt.:
> 
> 
> 
> ...




Ich habe es gemacht wie du es gesagt hast und hat Super funktioniert.

noch mal dankeschön


----------



## tristoni (28. Jan 2009)

ganz einfach:
du legst eine Methode Write an:
zb: 
public void write(){}

dann legst du nen BufferedWriter an 
datei zB.: "hallo.txt"

```
public void write(){
try{
            BufferedWriter writer = new BufferedWriter(new FileWriter(datei));
            int groesseo2 = o2.size();
            System.out.println("Größe von o2-Array " + groesseo2);            
            
                writer.write(variable1);
                writer.newLine(); 
                writer.write(variable1);
                writer.newLine(); 
                writer.write(variable1);
                writer.newLine(); 
                writer.write(variable1);
                writer.newLine(); 
                writer.write(variable1);
                writer.newLine(); 
                writer.write(variable1);
                writer.newLine();                 
            
            writer.close();
        }
        catch(IOException ex){
            System.out.println("Konnte die datei nicht schreiben");
        }
    }
}
```


----------



## 0x7F800000 (28. Jan 2009)

tristoni hat gesagt.:
			
		

> ```
> public void write()
> ```


kann mir irgendjemand spontan irgendwo irgendeine methode nennen, die nichts annimmt und void zurückgibt? ???:L


----------



## Ebenius (28. Jan 2009)

Andrey hat gesagt.:
			
		

> kann mir irgendjemand spontan irgendwo irgendeine methode nennen, die nichts annimmt und void zurückgibt? ???:L


Gibt's viele. JComponent.updateUI() zum Beispiel.


----------



## 0x7F800000 (28. Jan 2009)

repaint() und sowas, jaja... :? aber trotzdem, die methode da oben ist ja nicht irgendwas "updatendes", das wird doch einmal aufgerufen. Das sollte man private machen.


----------

