# File , Datei wird nicht erstellt warum?



## LaurenzG (8. Jun 2012)

Hallo Liebe Java Gemeinde !


Ich verstehe nicht warum der nachfolgende Code nicht klappt. Von der Syntax her ist alles okay, nur die Datei wird nicht erstellt !  


Aufgabenstellung :
Erstelle eine GUI, die es ermöglicht Zeichenketten permanent abzuspeichern (RandomAccessFile), anzuzeigen, zu editieren und zu löschen.
save(), speichert den dynamischen Array in eine Datei.

Mein Code:


```
public void save() throws IOException{ 
        File file= new File("PFAD/hallo.txt");
        RandomAccessFile rf = new RandomAccessFile(file, "rw");
         for(int i=0;i<txt.length;i++) {
            rf.writeChars(txt[i]);
          }
    }
```
----------------------------
actionPerformed

```
//Wenn Button "save" gedrückt wird folgt....
            if(e.getSource()==save){
            try {
                save();     //  Aufruf der "save"-Methode  
            } catch (IOException e1) {
             e1.printStackTrace();
            }
```


----------



## XHelp (8. Jun 2012)

Vermutlich weil da 
	
	
	
	





```
close()
```
 fehlt


----------



## LaurenzG (9. Jun 2012)

XHelp hat gesagt.:


> Vermutlich weil da
> 
> 
> 
> ...




Danke für deine Hilfe, könntest du deine Antwort bitte noch genauer verdeutlichen?


----------



## Noctarius (9. Jun 2012)

Ein wenig Eigeninitiative (z.B. mal RandomAccessFile anklicken) würde helfen RandomAccessFile (Java Platform SE 7 )


----------



## Laurenzg (9. Jun 2012)

Noctarius hat gesagt.:


> Ein wenig Eigeninitiative (z.B. mal RandomAccessFile anklicken) würde helfen RandomAccessFile (Java Platform SE 7 )




```
public void save() throws IOException{ 
        File datei= new File("C:/Users/Laurenz/hallo.txt");       //Es wird ein Objekt namens datei von der Klasse File erstellt , in Parameter ist der Pfad wo die Datei erzeugt werden soll
        RandomAccessFile rf = new RandomAccessFile(datei, "rw");  //Es wird ein Objekt namens rf von der Klasse RandomAccessFile erstellt , in Parameter das File Objekt, und "rw" für read & write,
        for(int i=0;i<txt.length;i++) {   
            rf.writeChars(txt[i]);  //Schreibt eine Zeichenkette zu der Datei in Form von Buchstaben.
        }
        rf.close(); //Schließt den RandomAccessFile und hinterlässt alle gespeichereten Daten darin
    }
```

Action Peformed


```
if(e.getSource()==save){
            try {
                save();     //  Aufruf der "save"-Methode  
            } catch (IOException e1) {
                e1.printStackTrace();
            }        
        }
```



Es wird noch immer nichts erstellt bin am Verzweifeln, denke auch nicht das es daran gelegen hat.


----------



## Noctarius (9. Jun 2012)

Dann setz mal noch ein flush() davor, dass sollte theoretisch der close() machen aber meiner Erfahrung nach kann das trotzdem helfen.
Ansonsten, brauchst du ein RAF oder reicht dir auch ein FileWriter?


----------



## LaurenzG (9. Jun 2012)

Noctarius hat gesagt.:


> Dann setz mal noch ein flush() davor, dass sollte theoretisch der close() machen aber meiner Erfahrung nach kann das trotzdem helfen.
> Ansonsten, brauchst du ein RAF oder reicht dir auch ein FileWriter?



flush() gibt es nur bei OutputStream , nicht bei RAF.

Naja ich habe es mit FileWriter schon geschafft, dadurch die Aufgabenstellung anderes war, habe ich es wieder geändert.

Ich hatte es sogar mit RAF,jedoch mit einen Parameter bei der save methode, seit ich den weggebracht habe ging es nicht mehr.

Er sollte sowieso eine txt.Datei bei der Objekterstellung der Klasse File an den gegebene Pfad erstellen ?
Die txt. Datei kann ja auch leer sein, aber nichtmal die habe ich an gegeben Pfad


----------



## Firephoenix (10. Jun 2012)

auf File gibt es übrigens auch Methoden wie createNewFile() , mkdir()  bzw mkdirs()
(oder anders gesagt new File() in java legt noch keine neue Datei auf der Platte an sondern ist erstmal nur ein Verweis).

Gruß


----------



## Noctarius (10. Jun 2012)

Wenn ich aber rein schreibe und die Stream schließe sollte die Datei schon geschrieben werden (zur Not auch angelegt).
Hast du als mode schon mal "rws" versucht? Das synchronisiert den Write auf die Festplatte.


----------



## LaurenzG (10. Jun 2012)

Schönen Guten morgen;

Habe jetzt beide Varianten versucht , beides nicht gegagen. Ich habe vorhin geschrieben das ich es auch mal ohne zusätzliche Methoden geschafft habe.

Dadurch ich die Methode 	createNewFile()  genommen habe UND TROTZDEM keine Datei erzeugt worden ist , denke ich das die Methode save() garnicht aufgerufen wird!.


Passt der Aufbau bei der Exception , weil den habe ich damals geändert seitdem geht es nicht mehr


Laurenz


----------



## LaurenzG (10. Jun 2012)

Also ich hab recht behalten, die save() Methode wird garnicht aufgegrufen habe, den selben code in einer main Methode überprüft .
Anbei der Code:


```
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import static javax.swing.JOptionPane.*;
import java.io.*;
/**
 * Ein GUI wird erstellt, die es ermöglicht eine Zeichenkette dauerhaft , abzuspeichern , anzuzeigen, zu editieren und zu löschen.
 * Die GUI besitzt 4 Buttons, wenn man auf einen draufdrückt,  ruft er eine Methode auf , die je nach Funktion verschiede Anweisungen ausführt. 
 * 
 * 
 * @author Gebauer Laurenz
 * @version 21.05.2012
 */
public class SSAcces extends JApplet implements ActionListener
{   
    //Attribute
    private String []txt;
    private int index;
    private JButton add,delete,edit,save;
    private JLabel label;

    public void init(){
        JPanel panel;
        JPanel panella;
        //Ein GridLayout wird den Applet zugewiesen
        this.setLayout(new GridLayout(2,0));

        //Buttons erzeugen
        add= new JButton("Adden");
        delete= new JButton("Delete");
        edit= new JButton("Edit");
        save= new JButton("Save");

        //Panel , wo die Buttons eingefügt werden
        panel= new JPanel();
        panel.setLayout(new GridLayout(1,0));

        //Panel wo ein Label eingefügt wird
        panella= new JPanel();
        panella.setLayout(new BorderLayout());

        //Buttons Hinzufügen beim Panel
        panel.add(add);
        panel.add(delete);
        panel.add(edit);
        panel.add(save);

        //String Array mit 100 Elementen erzeugen
        txt= new String[100];

        //Label
        label= new JLabel();
        panella.add(label,BorderLayout.CENTER);

        //Hinzufügen der Panel zum Gridlayout
        add(panel);
        add(panella);

        //Regrestieren beim ActionListener
        add.addActionListener(this);
        delete.addActionListener(this);
        edit.addActionListener(this);
        save.addActionListener(this);

    }

    /**
     * Die Methode add , fügt eine Text an der gewünschten Stelle ein. 
     * Dieser Text wird den Label zugewiesen
     *
     * return: void
     */
    public void add(String txt[],int index){
        index=Integer.parseInt(showInputDialog("Den Index wo die Zeichenkette gespeichert werden soll")); //Einlesen des index
        txt[index]=showInputDialog("Gib mir eine Zeichenkette die hinzugefügt werden soll");
        label.setText(txt[index]);  //Den Label wird ein Text zugewiesen

    }

    /**
     * Die Methode delete , löscht den Text an der gewünschten Stelle.
     * 
     * return: void
     */
    public void delete(int index){
        index=Integer.parseInt(showInputDialog("Gib mir den Index wo die Zeichenkette gelöscht werden soll"));
        txt[index]="";              //Der Text von den gewünschten Stelle wird gelöscht
        label.setText(txt[index]);  

    }

    /**
     * Die Methode edit , Bearbeitet den Text an der gewünschten Stelle
     * Der bearbeitete Text wird den Label zugewiesen
     * 
     * return: void
     */
    public void edit(String txt[], int index){
        index=Integer.parseInt(showInputDialog("Den Index wo die Zeichenkette bearbeitet werden soll"));
        txt[index]=showInputDialog(txt[index]+"  <--  Bearbeite deine Zeichkette");
        label.setText(txt[index]); //Den Label wird ein Text zugewiesen

    }

    /**
     * Die Methode save , speichert den dynamischen Array in eine Datei.
     * 
     * return: void
     */
    public void save() throws IOException{ 
        File datei= new File("C:/Users/Laurenz/hallo.txt");       //Es wird ein Objekt namens datei von der Klasse File erstellt , in Parameter ist der Pfad wo die Datei erzeugt werden soll
        datei.createNewFile();
        RandomAccessFile rf = new RandomAccessFile(datei, "rws");  //Es wird ein Objekt namens rf von der Klasse RandomAccessFile erstellt , in Parameter das File Objekt, und "rw" für read & write,
        for(int i=0;i<txt.length;i++) {   
            rf.writeChars(txt[i]);  //Schreibt eine Zeichenkette zu der Datei in Form von Buchstaben.
        }
        rf.close(); //Schließt den RandomAccessFile und hinterlässt alle gespeichereten Daten darin
    }

    public void actionPerformed(ActionEvent e){
        //Wenn Button "add" gedrückt wird , wird eine Zeichenkette und ein Integer eingelesen, und die add Methode aufgerufen
        if(e.getSource()==add){
            add(txt,index);
        }
        //Wenn Button "delete" gedrückt wird , wird ein Integer eingelesen, und die delete Methode aufgerufen
        if(e.getSource()==delete){
            delete(index);
        }
        //Wenn Button "edit" gedrückt wird , kann man eine  Zeichenkette and gewünschter stelle bearbeiten
        if(e.getSource()==edit){
            edit(txt,index);
        }
        //Wenn Button "save" gedrückt wird , wird die Methode save aufgerufen
        if(e.getSource()==save){
            try {
                save();     //  Aufruf der "save"-Methode  
            } catch (IOException e1) {
                e1.getCause();
            }        
        }
    }
}
```


----------



## vanny (10. Jun 2012)

:joke:


----------

