2 votes

lire un fichier binaire jusqu'à la fin

J'ai une série d'objets différents sérialisés dans un fichier binaire, comment puis-je lire le fichier jusqu'à la fin ?

    try {
        ObjectInputStream reader = new ObjectInputStream(new FileInputStream(fname));

        Object obj = reader.readObject(); 

        if (obj instanceof Azienda) {
            Azienda a = (Azienda) obj;
            company.put(a.getCod(), a);
        } else if (obj instanceof Privato) {
            Privato p = (Privato) obj;
            privato.put(p.getCod(), p);
        }
    } catch (ClassNotFoundException cnfe) {
        cnfe.printStackTrace();
    } catch (FileNotFoundException ffe) {
        System.err.println("Error: the file was not found!");
    } catch (IOException ioe) {
        ioe.printStackTrace();
    }

De cette façon, je ne lis qu'un seul objet par lecture.

lorsque je lis un fichier texte, j'utilise null

4voto

ratchet freak Points 22412
try{
    while(true) {
       Object obj=reader.readObject()
     // do sth with object
    }
}catch(EOFException e){
//we expect it so ignore
}

il n'y a pas de contrôle EOF en dehors de l'exception lorsque vous lisez au-delà de l'ObjectInputStream, vous devrez donc utiliser l'odeur de code appelée exceptions pour le flux de contrôle.

1voto

Ján Vorčák Points 3636
    ObjectInputStream reader = null;

    try {
        reader = new ObjectInputStream(new FileInputStream("sth"));

        Object obj = null;
        while ((obj = reader.readObject()) != null) {
            System.out.println(obj);
        }

    } catch (EOFException e) {
        System.out.println("finnished reading");
    } catch (ClassNotFoundException ex) {
        ex.printStackTrace();
    } catch (FileNotFoundException ex) {
        System.err.println("Error: the file was not found!");
    } catch (IOException ex) {
        ex.printStackTrace();
    } finally {
        reader.close();
    }

1voto

JB Nizet Points 250258

Il semble qu'une exception EOFException soit levée lorsqu'il n'y a plus d'objet à lire dans le flux. Malheureusement, ce n'est même pas documenté. Je vois donc les solutions suivantes :

  • vous lisez en boucle jusqu'à ce que vous obteniez cette exception,
  • vous faites en sorte de connaître à l'avance le nombre d'objets dans le flux,
  • vous faites en sorte qu'il y ait un objet marqueur qui marque le dernier objet du flux,
  • vous sérialisez (et désérialisez) un objet unique : un List<Object> contenant tous les objets. Cette dernière solution empêche bien sûr d'écrire les objets à la volée dans le flux et oblige à avoir tous les objets en mémoire avant de les sérialiser.

1voto

nplatis Points 270

ObjectInputStream n'a pas de méthode concrète pour vérifier la fin d'un fichier.

Mais chaque read...() méthode de ObjectInputStream lance un EOFException lorsqu'il tente de lire au-delà de la fin du fichier. Malheureusement, cela n'est pas explicitement documenté pour readObject() mais il l'est pour toutes les autres méthodes ( readInt() etc.)

http://docs.oracle.com/javase/7/docs/api/java/io/ObjectInputStream.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X