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 �clair�
    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
    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 : 56
    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
    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 �clair�
    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
    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