2011-11-03 2 views
0

C'était la première fois que j'essayais de sauvegarder un objet dans un fichier, donc je ne sais pas où je me trompe. Ceci est juste un programme de test, l'original est beaucoup plus grand. L'enregistrement est réussi, le fichier de sauvegarde est créé. Cependant, je n'arrive pas à me souvenir de ce fichier/objet. La compilation fonctionne bien. Quelqu'un pourrait-il expliquer où exactement je me suis trompé? Et dans un peu plus de style « tutoriel débutants » s'il vous plaît, je suis vraiment mauvais avec « Serializable »Java, fichier enregistré dans l'objet, impossible de le récupérer

import java.io.*; 
import java.util.*; 

class save { 

    public static void main(String[] args) { 

     HashMap<String, Person> list = new HashMap<String, Person>(); 

     Person person = new Person("12", "AAA", "XXX"); 
     list.put(person.getID(), person); 

     if(list.containsKey(person.getID())) 
      System.out.println(list.get(person.getID())); 


     savePerson(person); 

     list.remove(person.getID()); 

     if(list.containsKey(person.getID())) 
      System.out.println(list.get(person.getID())); 
     else 
      System.out.println("Person is not available"); 

     person = loadPerson("12"); 

     System.out.println(list.size()); 

    } 

    protected static void savePerson(Person person) { 
     File source = new File("person"+person.getID()+".data"); 
     try { source.createNewFile(); } catch(IOException e) {System.out.println("Can't create new file : " +e.getMessage());} 
     try { 
      FileOutputStream personFile = new FileOutputStream("person"+person.getID()+".data"); 
      try { 
       ObjectOutputStream personObj = new ObjectOutputStream (personFile); 
       personObj.writeObject(person); 
       personObj.close(); 
       personFile.close(); 
      } catch(IOException e){System.out.println("Can't save the object :" +e.getMessage());} 

     } catch(FileNotFoundException e){System.out.println("Can't read the damn file :" +e.getMessage());} 

    } 

    protected static Person loadPerson(String ID) { 
     Person person = null; 
     try { 
      FileInputStream personFile = new FileInputStream("person"+ID+".data"); 
      try { 
       ObjectInputStream personObj = new ObjectInputStream(personFile); 
       try { 
        person = (Person)personObj.readObject(); 
        personObj.close(); 
        personFile.close(); 
       } catch(ClassNotFoundException e){System.out.println("Can't find the class :" +e.getMessage());} 
      } catch(IOException e){System.out.println("Can't save the object :" +e.getMessage());} 
     } catch(FileNotFoundException e){System.out.println("Can't read the damn file :" +e.getMessage());} 
     return person; 
    } 
} 

EDIT: Voici la classe personne à la demande:

import java.io.*; 

class Person implements Serializable { 

    private String id; 
    private String fname; 
    private String lname; 

    public Person(String id, String fname, String lname) { 
     this.id = id; 
     this.fname = fname; 
     this.lname = lname; 
    } 

    protected String getID() { return id; } 
    protected String getFname() { return fname; } 
    protected String getLname() { return lname; } 

    protected void setFname(String newFname) { fname = newFname; } 

    public String toString() { 
     return id + ", " + fname + " " + lname; 
    } 
} 
+5

Vous ignorez pas mal d'exceptions. Êtes-vous sûr qu'aucun d'eux n'est jeté? –

+2

Essayez d'imprimer e.getMessage() dans toutes les prises. Vous ne fermez jamais un fichier? – Kris

+2

cela peut être une bonne idée de fournir également une classe Person. @vedran – Zohaib

Répondre

3

Fermez le fichier après écrire à elle. Vous n'avez probablement pas accès au fichier. En outre, si vous remplissez les blocs catch vides avec l'impression de l'exception, vous serez plus proche de trouver le problème.

Vous pouvez fermer en appelant personFile.close() (et même après avoir lu l'objet)

EDIT: Je testé votre (nouveau) code, et il fonctionne très bien. J'ai été capable de lire l'objet, mais votre code ne fait rien avec.

BTW, vous n'avez pas besoin de fermer les deux cours d'eau, comme indiqué dans close:

Si ce flux a un canal associé le canal est fermé et .

+0

Pourriez-vous s'il vous plaît me dire comment faire cela? Encore une fois, je m'excuse pour l'ignorance, mais étudiant de première année ici ... :) – vedran

+1

@vedran Voir edit – MByD

+0

J'ai ajouté à la fois personObj.close(); et personFile.close(); mais il ne se passe plus rien ... – vedran

Questions connexes