IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Entrée/Sortie Java Discussion :

Problème lors de la lecture d'un objet ObjectInputStream


Sujet :

Entrée/Sortie Java

  1. #1
    Membre habitué
    Homme Profil pro
    Enseignant
    Inscrit en
    Octobre 2005
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Mali

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2005
    Messages : 246
    Points : 159
    Points
    159
    Par défaut Problème lors de la lecture d'un objet ObjectInputStream
    Bonjour tout le monde,

    Je rencontre une exception lors de la lecture du contenu d'un fichier ObjectInputStream. Ce fichier contient un objet de type Personne.
    Lors de la rencontre, le message suivant s'affiche : java.io.StreamCorruptedException: invalid type code: AC.

    J'ai enregistré trois Objets sans problème mais je n'arrive pas à les lire.

    Je vous donne ici, les codes de l'objet et de l'application.

    Code de l'objet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    public class Personne implements Serializable{
     
    	private static final long serialVersionUID = 1L;
    	private String nom;
    	private String prenom;
    	private java.util.Date datenais;
    	private String lieunais;
    	private String sexe;
     
    	public Personne() {
     
    	}
    ....
    }
    Code de l'application :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
     
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.text.SimpleDateFormat;
    import java.util.Scanner;
    public class LectureEcritureObjets {
     
    	public static void main(String[] args) {
     
    		Personne p=new Personne();
    		File fichier=new File("c:/mesfichiers/listePersonne.dat");
    		menu(p, fichier);
    	} // fin de main()
     
    	public static void menu(Personne p, File fichier){
    		Scanner clavier=new Scanner(System.in);
    		int choix;
    		do {
    			System.out.println("---------------------");
    			System.out.println("|Menu Principal     |");
    			System.out.println("---------------------");
    			System.out.println("|1. Enregistrer     |");
    			System.out.println("|2. Ouvrir          |");
    			System.out.println("|0. Quitter         |");
    			System.out.println("---------------------");
    			System.out.print("Choix : ");
    			choix=clavier.nextInt();
    			switch(choix){
    			case 1:enregistrer(p, fichier);break;
    			case 2:ouvrir(p, fichier);break;
    			case 0:{System.out.println("Bye Bye !"); break;}
    			default : {System.out.println("Opération annulée !");choix=0;}
    			}// fin de switch
    		} 
    		while(choix!=0);	// fin de do..while
    	} // fin de menu()
    public static void enregistrer(Personne p, File fichier) {
     
    ....
     
    }
     
    public static void ouvrir(Personne p, File fichier){
    		try {
    			ObjectInputStream flux = new ObjectInputStream(
    					new FileInputStream(fichier));
     
    			while(flux.available() > 0) {
    			p = (Personne) flux.readObject();
    			SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
    			String dateNais = sdf.format(p.getDatenais());
    			System.out.println(
    					p.getNom() + "\t" + p.getPrenom() + "\t" + dateNais + "\t" + p.getLieunais() + "\t" + p.getSexe());
    			System.out.println();
    			}
    			flux.close();
    		} catch (IOException ioe) {
    			System.err.println(ioe);
    		} catch (ClassNotFoundException cnfe) {
    			System.err.println(cnfe);
    		}
     
    	} // fin de la méthode ouvrir()
     
    }
    Merci pour l'attention accordée à cette demande d'aide.

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Un ObjectInputStream c'est fait pour lire un objet qui a été écrit par ObjectOutputStream, pas une série d'objets mis les uns derrière les autres dans le flux. Il y a une structure précise de type entête/donnée, pour l'objet. On écrivant plusieurs objets à la suite dans un ObjectOutputStream, on a qu'une seule entête au tout début, et donc ça plante à la lecture du deuxième objet (l'exception que tu obtiens). Il faudrait mettre les objets dans un objet (ArrayList par exemple) et sérialiser cet objet, ou alors utiliser un sous objectoutputstream par instance sur un flux unique pour le fichier, ou un conteneur (zip, jar...). Ou alors se débrouiller pour que l'entête soit écrite à chaque fois qu'on colle un nouvel objet à la suite d'un autre (en appelant la méthode writeStreamHeader() dans une extension de la classe). Pour la lecture, pour ne pas être obligé de procéder par exception il faudrait par exemple écrire le nombre d'objets au début du flux principal, ou un marqueur particulier, avec séparateur entre chaque objet.

    D'ailleurs, on n'utilise pas available() pour déterminer qu'il reste quelque chose à lire dans le flux. Cette méthode retourne le nombre d'octets disponibles à la lecture sans bloquer la lecture (sans qu'elle soit obligée d'attendre la suite), pas ce qu'il reste à lire dans le flux. C'est un contresens que de l'utiliser pour déterminer qu'on a consommé complètement le flux.

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    public class Demo {
     
    	public static void main(String[] args) {
     
    		Machin[] machins = { new Machin("1"), new Machin("2"), new Machin("3") };
     
    		try {
     
    			try (OutputStream outputStream = Files.newOutputStream(Paths.get("machins.dat"))) {
     
    				DataOutputStream dataOutputStream = new DataOutputStream(outputStream);
    				dataOutputStream.writeInt(machins.length);
    				dataOutputStream.flush();
     
    				for (Machin machin : machins) {
    					ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);
    					try {
    						objectOutputStream.writeObject(machin);
    					}
    					finally {
    						objectOutputStream.flush();
    					}
    				}
     
    			}
     
    			try(InputStream inputStream = Files.newInputStream(Paths.get("machins.dat"))) {
    				DataInputStream dataInputStream = new DataInputStream(inputStream);
    				for(int i=0, n=dataInputStream.readInt(); i<n; i++) {
    					ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);
    					try {
    						Machin machin = (Machin) objectInputStream.readObject();
    						System.out.println(machin.getData());
    					} catch (ClassNotFoundException e) {
    						break;
    					}
    				}
    			}
     
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
     
    	}
     
    	public static class Machin implements Serializable {
    		private String data;
     
    		public Machin(String data) {
    			this.data = data;
    		}
     
    		public String getData() {
    			return data;
    		}
     
    		public void setData(String data) {
    			this.data = data;
    		}
    	}
     
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre habitué
    Homme Profil pro
    Enseignant
    Inscrit en
    Octobre 2005
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Mali

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2005
    Messages : 246
    Points : 159
    Points
    159
    Par défaut
    Merci pour la réponse.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème lors de la lecture d'un fichier
    Par _SamSoft_ dans le forum C
    Réponses: 2
    Dernier message: 23/02/2008, 15h14
  2. Problème lors de la lecture d'un fichier xml avec XMLBeans
    Par oscar78 dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 07/09/2007, 14h04
  3. Réponses: 4
    Dernier message: 29/06/2007, 11h17
  4. Problèmes lors de la lecture d'un fichier
    Par samothtronicien dans le forum C++
    Réponses: 5
    Dernier message: 27/05/2006, 00h05
  5. Problème lors de la lecture d'un fichier avec Input...
    Par Kronoob dans le forum VB 6 et antérieur
    Réponses: 13
    Dernier message: 18/11/2005, 18h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo