2010-11-16 6 views
0

J'ai créé une méthode dans mon affectation java pour écrire dans un fichier à partir d'un LinkedList (j'ai utilisé la sérialisation), puis j'ai créé une autre méthode pour lire le fichier dans le inkedList. Ce qui suit est le corps de ma méthode:gérer EOFException dans java

try { 
    FileInputStream fin = new FileInputStream("c:\\Info.ser"); 
    ObjectInputStream ois = new ObjectInputStream(fin); 


    Employee e = (Employee) ois.readObject(); 
    linkP.add(e); 


} catch (Exception e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 

mais cela ne fonctionne pas correctement. Je pense que cette partie:

Employee e = (Employee) ois.readObject(); 
linkP.add(e); 

lit le premier objet du fichier dans la liste liée et ignore les autres objets. Je l'ai entouré pour boucle et tout en boucle plusieurs fois mais il provoque EOFException. Comment puis-je changer ma méthode pour lire tous les objets du fichier dans LinkedList?

Répondre

1

La façon la plus simple est d'inclure la taille de la liste que la première chose écrite dans le fichier. Lorsque vous lisez le fichier, la première chose que vous récupérez est la taille. Ensuite, vous pouvez lire le nombre attendu d'objets.

0

aurait probablement besoin de voir comment vous écrivez en premier lieu, mais en général:

ObjectInputStream is = null; 
try 
{ 
    is = new ObjectInputStream(new FileInputStream("c:/Info.ser")); 
    Object object = null; 
    while ((object = is.readObject()) != null) 
    { 
     linkP.add(object); 
    } 
} 
catch(Exception e) 
{ 
    //Whatever you need to do 
} 
finally 
{ 
    //Never forget to close your streams or you'll run into memory leaks 
    try 
    { 
     if (is != null) 
     { 
      is.close(); 
     } 
    } 
    catch (Exception ex) 
    { 
     ex.printStackTrace(); 
    } 
} 

En outre, sa pratique probablement mieux pour vous de gérer les exceptions individuellement, mais je ne peux pas vraiment dire ce que le les jets de jet remplacent ainsi le (Exception e) avec tout le reste.

+1

Downvoted, car readObject() ne renverra pas de valeur null, mais lancera une exception EOFException. – mhaller

+0

Ou plutôt, si elle renvoie null c'est parce que quelqu'un a écrit un null. Ce n'est pas un EOS. – EJP

1

Etes-vous sûr que le fichier sérialisé contient tous les éléments? Il me semble que vous pourriez seulement en sérialiser un.

0

Surround Employee e = (Employee) ois.readObject(); linkP.add(e); avec une boucle for comme vous le suggérez et entourer le .readObject appel avec un try/catc(EOFException)

1

Remarque: Veuillez également ajouter le code dans lequel vous créez le fichier info.ser, car vous avez peut-être corrompu ObjectOutputStream en le fermant/rouvrant pour chaque objet.

Mais pour répondre à votre question, la bonne façon de le faire (sans exception capture) serait:

@Test 
public void testSerializingListByEntries() throws Exception { 
    List<Serializable> list = new ArrayList<Serializable>(); 
    list.add(new Date()); 
    list.add(new Date()); 

    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    ObjectOutputStream oos = new ObjectOutputStream(baos); 
    oos.writeInt(list.size()); // Magic 
    for(Serializable o : list) { 
     oos.writeObject(o); 
    } 
    oos.close(); 

    ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); 
    ObjectInputStream ois = new ObjectInputStream(bais); 
    int count = ois.readInt(); 
    List<Object> newList = new ArrayList<Object>(); 
    for(int i = 0; i < count;i++) { 
     newList.add(ois.readObject()); 
    } 
    ois.close(); 
    assertEquals(list,newList); 
} 

Oui, vous devez fermer vous-même les cours d'eau bien sûr. Omis pour la lisibilité.

3

Si vous avez utilisé LinkedList pour la sérialisation vous devriez vous attendre une LinkedList désérialiser:

linkP= (LinkedList) ois.readObject(); 

au lieu de

Employee e = (Employee) ois.readObject(); 
    linkP.add(e); 
0

Juste attraper EOFException séparément à l'intérieur de votre boucle de lecture et de les traiter en conséquence, à savoir éclater de la boucle.

Questions connexes