2016-04-10 20 views
0

JFileChooser Mit Datei zu speichern und alles funktioniert perfekt:Kann nicht bekommen Daten aus der Datei

private void saveFileDialog(){ 

    fileChooser = new JFileChooser(System.getProperty("employees.dat")); 
    disableTextField(fileChooser.getComponents()); 

    fileChooser.setSelectedFile(new File("employees.dat")); 
    fileChooser.setDialogTitle("File to save"); 

    int userSelection = fileChooser.showSaveDialog(this); 
    if (userSelection == JFileChooser.APPROVE_OPTION) { 
     File fileToSave = fileChooser.getSelectedFile(); 
     save(); 
     System.out.println("Save as file: " + fileToSave.getAbsolutePath()); 
    } 
} 

Methode aufrufen save():

public void save(){ 
    RandomAccessFile file = null; 
    try { 
     file = new RandomAccessFile("employees.dat", "rw"); 
    } catch (FileNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    try{ 
     for(Employee em: list){ 
     if(list != null){ 

     file.writeUTF(em.getPps()); 
     file.writeUTF(em.getName()); 
     file.writeUTF(em.getSurname()); 
     file.writeUTF(em.getGender()); 
     file.writeUTF(em.getDep()); 
     file.writeInt(em.getSalary()); 
     file.writeUTF(em.getFullTime()); 
      } 
     } 

     file.close(); 

    }catch(IOException e1){ 
     System.out.println("Cant save"); 
    } 
} 

Öffnen der Datei auf meinem Computer und alle Daten aufgezeichnet und gespeichert.

Problem ist: Ich kann keine Daten aus der Datei erhalten

Hier meine getFromFile Methode ist:

public void getFromFile(){ 
    RandomAccessFile file = null; 
    try { 
     file = new RandomAccessFile("employees.dat", "rw"); 
    } catch (FileNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    try{ 
    while (file.getFilePointer() < file.length()){ 

      Employee em = new Employee(); 

       System.out.println("Saving"); 
       em.setPps(file.readUTF()); 
       em.setName(file.readUTF()); 
       em.setSurname(file.readUTF()); 
       em.setGender(file.readBoolean()); 
       em.setDep(file.readUTF()); 
       em.setSalary(file.readInt()); 
       em.setFulltime(file.readBoolean()); 
       list.add(em); 

    } 
     file.close(); 
     }catch(IOException e1){ 
      System.out.println("Cant save"); 
      e1.printStackTrace(); 
     } 
} 

Meine JFileChooser für aus der Datei bekommen:

openItem.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
     fileChooser = new JFileChooser("."); 

     fileChooser.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
      System.out.println("Action"); 

      } 
     }); 

     int status = fileChooser.showOpenDialog(null); 

     if (status == JFileChooser.APPROVE_OPTION) { 

      File selectedFile = fileChooser.getSelectedFile(); 
      getFromFile(); 

      System.out.println(selectedFile.getParent()); 
      System.out.println(selectedFile.getName()); 
     } else if (status == JFileChooser.CANCEL_OPTION) { 
      System.out.println("calceled"); 

     } 

     } 
}); 

Konsole zeigt mir-System .out.println ("Speichern"); und dann System.out.println ("Cant save"); . Scheint mir, dass alles funktionieren sollte, aber Datei ist leer und nichts Neues erscheint in meinem Programm.

Hier wird folgende Ausnahme kommen:

java.io.EOFException 
     at java.io.RandomAccessFile.readFully(RandomAccessFile.java:399) 
     at java.io.DataInputStream.readUTF(DataInputStream.java:592) 
     at java.io.RandomAccessFile.readUTF(RandomAccessFile.java:921) 
+1

Stattdessen der Druck Ihrer eigenen Fehlermeldung machen würden Sie sollten Verwenden Sie 'e1.printStackTrace()', um zu sehen, was das Problem tatsächlich ist. – Titus

+0

Danke. Ich werde meinen Beitrag jetzt aktualisieren. – Alex

+0

Ich bin verwirrt, woher weiß 'save', welche Datei in' saveFileDialog' ausgewählt wurde? Es speichert nur die Datei in der aktuellen Arbeitsdirectory – MadProgrammer

Antwort

1

Ihr "Kern" Problem wahrscheinlich hier ist ...

System.out.println("Saving"); 
em.setPps(file.readUTF()); 
em.setPps(file.readUTF()); 
em.setName(file.readUTF()); 
em.setSurname(file.readUTF()); 
em.setGender(file.readBoolean()); 
em.setDep(file.readUTF()); 
em.setSalary(file.readInt()); 
em.setFulltime(file.readBoolean()); 

Sie setPps zweimal aufrufen.

Auch gibt es keine Zusammenstellung zwischen dem, was Sie JFileChooser wählen mit und in dem die Datei geschrieben wird immer/lesen von

Wenn wir einen kurzen Blick auf den Lese-/Schreiboperationen übernehmen wir die Doppe Lese sehen Betrieb

+----------------------------------+-------------------------------------+ 
| Write       | Read        | 
+----------------------------------+-------------------------------------+ 
| file.writeUTF(em.getPps());  | em.setPps(file.readUTF());   | 
+----------------------------------+-------------------------------------+ 
| file.writeUTF(em.getName());  | em.setPps(file.readUTF());   | 
+----------------------------------+-------------------------------------+ 
| file.writeUTF(em.getSurname()); | em.setName(file.readUTF());   | 
+----------------------------------+-------------------------------------+ 
| file.writeUTF(em.getGender()); | em.setSurname(file.readUTF());  | 
+----------------------------------+-------------------------------------+ 
| file.writeUTF(em.getDep());  | em.setGender(file.readBoolean()); | 
+----------------------------------+-------------------------------------+ 
| file.writeInt(em.getSalary()); | em.setDep(file.readUTF());   | 
+----------------------------------+-------------------------------------+ 
| file.writeUTF(em.getFullTime()); | em.setSalary(file.readInt());  | 
+----------------------------------+-------------------------------------+ 
|         | em.setFulltime(file.readBoolean()); | 
+----------------------------------+-------------------------------------+ 

es gibt auch einen Unterschied zwischen dem, was Sie schreiben und was Sie lesen

Zum Beispiel Sie das Geschlecht mit file.writeUTF(em.getGender()); schreiben, aber lesen Sie esmit

Sie sollten wahrscheinlich file.writeBoolean(em.getGender());

verwenden Wenn es richtig über meine JFileChooser in die Datei zu speichern, bedeutet es, dass es Vergleich zwischen ihnen ist?

Lassen Sie uns einen Blick auf Ihre saveFileDialog Methode

private void saveFileDialog(){ 

    fileChooser = new JFileChooser(System.getProperty("employees.dat")); 
    disableTextField(fileChooser.getComponents()); 

    fileChooser.setSelectedFile(new File("employees.dat")); 
    fileChooser.setDialogTitle("File to save"); 

    int userSelection = fileChooser.showSaveDialog(this); 
    if (userSelection == JFileChooser.APPROVE_OPTION) { 
     File fileToSave = fileChooser.getSelectedFile(); 
     save(); 
     System.out.println("Save as file: " + fileToSave.getAbsolutePath()); 
    } 
} 

Sie eine lokale Variable fileToSave genannt schaffen, hält (nehme ich an das Verzeichnis Sie die Datei gespeichert in möchten), aber es hat nur Kontext dieser Methode, niemand sonst kann

verwenden So sollte Ihre Methode lesen ...

private void saveFileDialog(){ 
    save(); 
} 

und es würde das gleiche Ergebnis

ich im Grunde auch erreichen würde betrachten so etwas wie JAXB verwenden, die wahrscheinlich Ihr Leben viel einfacher

+0

Vielen Dank, ich wurde los Schritte zweimal aufrufen, aber immer noch das gleiche Problem. Wenn es über meinen JFileChooser ordnungsgemäß in der Datei gespeichert wird, bedeutet dies, dass eine Kollation zwischen ihnen besteht? – Alex

+0

Aber "wie" weiß die 'save' Methode, wo die Datei gespeichert werden soll? Sie übergeben diese Informationen nie an die Methode – MadProgrammer

+0

Ich gehe einfach dorthin, wo ich meine Datei speichern möchte, und speichern Sie sie manuell in meinem Ordner für diese Anwendung. Und die Datei dort öffnen und alle Daten werden gespeichert. – Alex