2010-08-10 18 views
0

J'essaie d'écrire un objet de type "HashMap" dans un fichier & le récupérer lorsque mon programme s'exécute à nouveau. Mais j'ai fait face à une exception EOFException lorsque j'essaie de lire cet objet et que l'objet n'est pas lu dans le fichier. J'utilise les méthodes close() flush() & lorsque j'ai écrit l'objet pour le FileOutputStream & ObjectOutputStream. Aussi je crée OutputStream & InputStream ensemble pour mon dossier. voici mon code:Un problème avec java Flux d'objets lors de l'écriture dans le fichier

DataOutputStream outToFile; 
DataInputStream inFromFile; 

ObjectOutputStream writeTableToFile; 
ObjectInputStream readTableFromFile; 
File tableFile; 

public DNS(){ 
    try { 
     tableFile = new File("table.txt"); 
     outToFile = new DataOutputStream(new FileOutputStream(tableFile)); 
     writeTableToFile = new ObjectOutputStream(outToFile); 

     inFromFile = new DataInputStream(new FileInputStream(tableFile)); 
     readTableFromFile = new ObjectInputStream(inFromFile); 
     HashMap table2 = (HashMap) readTableFromFile.readObject(); 
     if (table2 == null) 
      table=new HashMap(100); 
     else 
      table = table2; 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    }catch(EOFException e){ 
     table=new HashMap(100); 
    } 
    catch (IOException e) { 
     e.printStackTrace(); 
    } catch (ClassNotFoundException e) { 
     e.printStackTrace(); 
    } 

}

et voici le code pour objet écrit:

  table.put(NameField.getText(), IPField.getText()); 
      try { 
       //writeTableToFile.reset(); 
       writeTableToFile.writeObject(table); 
       writeTableToFile.flush(); 
      } catch (IOException e1) { 
       e1.printStackTrace(); 
      } 

Cordialement, sajad

+0

Un flux de sortie et un flux d'entrée vers un même fichier sont-ils tous deux ouverts en même temps? Est-ce une bonne idée? Créez un flux d'entrée ouvert lorsque vous essayez de lire, puis fermez-le. Créez et ouvrez le flux de sortie lorsque vous voulez écrire, puis fermez-le. –

Répondre

0

Le fichier semble être incomplet. Quand je regarde votre code, vous créez le fichier table.txt et essayez de le lire immédiatement après.

Ce cteur:

new FileOutputStream(tableFile) 

remplacera le fichier. Si vous le lisez par la suite, il sera vide (sauf les informations d'en-tête de l'OOS)

+0

Alors merci. J'ai remplacé les initialisations OutputStreams par la méthode qui enregistre l'objet à la fin du programme et le problème a été résolu. Mais est-il vrai que OutputStreams et inputStreams ne devraient pas être utilisés simultanément dans un seul endroit pour qu'un fichier évite des problèmes comme celui-ci? – sajad

+0

Oui, vous devriez toujours en ouvrir un seul pour un seul fichier à la fois. –

+0

Si vous avez besoin de lire et d'écrire, utilisez RandomAccessFile. –

0

EOFException signifie que le dossier est incomplet. Donc ce n'est pas flush() éd ou pas close() ed ou une exception est avalée quelque part.

+0

M.! J'ai utilisé flush() dans mon code. aussi lors de la fermeture du programme j'ai utilisé close(). J'ai vu le fichier; ce n'est pas vide. – sajad

+0

Il était vide lorsque vous l'avez lu parce que vous en aviez créé un nouveau et que vous ne l'aviez pas encore écrit. – EJP