J'ai 3 classes. La classe Personne implements Serializable et deux classes
pour la gestion des flux (entreeb et sortieb) voir ci joint les programmes.
Pouvez vous me dire pourquoi lorsque je fais tourner sortieb 2fois, il y a
une exception qui est génère avec entreeb ?
Merci de votre aide
//Classe Personne
import java.io.*;
class Personne implements Serializable {
private String nom;
private int age;
public Personne(String n, int a){
nom = n;
age = a;
}
public void aff() {
System.out.println (nom + " " + age);
}
}
//Flux entree
import java.io.*;
import java.util.*;
public class entreeb {
public static void main(String[] args){
Personne p;
int i=0;
try {
FileInputStream fist= new FileInputStream("Personne.ser");
ObjectInputStream oist = new ObjectInputStream(fist);
try {
while (true) // boucle arreté par l'exception de fin de fichier
{ System.out.println("i="+i);
p = (Personne) oist.readObject();
p.aff();
i++;
}
} catch (EOFException e) { }
oist.close();
} catch (Exception e) {
System.out.println("Exception au chargement des personnes: " +
e.getMessage());
}
}
}
//Flux sortie
import java.io.*;
import java.util.*;
public class sortieb {
public static void main(String[] args) throws IOException {
Personne p = new Personne("name", 55);
File f=new File("Personne.ser");
FileOutputStream fost= new FileOutputStream(f,true);
ObjectOutputStream oost = new ObjectOutputStream(fost);
int i=0;
while (i<5) {
System.out.println("i = "+i+ "p="+p);
oost.writeObject(p);
i+=1;
}
oost.close();
}
}
Peut être faudrait-il rajouter un "fost.close();" après "oost.close();"
Joseph KHOURY
En fait, je voulais ouvrir le fichier Personne.ser et ajouter des lignes supplémentaires. Comment faire en mode sérialization ? Est-ce que c'est possible ou non? Si non quelle est la bonne démarche?
"Joseph KHOURY" a écrit dans le message de news: 43c4984f$0$25665$
Bonjour,
J'ai 3 classes. La classe Personne implements Serializable et deux classes pour la gestion des flux (entreeb et sortieb) voir ci joint les programmes.
Pouvez vous me dire pourquoi lorsque je fais tourner sortieb 2fois, il y a une exception qui est génère avec entreeb ?
Merci de votre aide
//Classe Personne import java.io.*; class Personne implements Serializable { private String nom; private int age; public Personne(String n, int a){ nom = n; age = a; } public void aff() { System.out.println (nom + " " + age); } }
//Flux entree import java.io.*; import java.util.*; public class entreeb { public static void main(String[] args){ Personne p; int i=0; try { FileInputStream fist= new FileInputStream("Personne.ser"); ObjectInputStream oist = new ObjectInputStream(fist); try { while (true) // boucle arreté par l'exception de fin de fichier { System.out.println("i="+i); p = (Personne) oist.readObject(); p.aff(); i++; } } catch (EOFException e) { } oist.close(); } catch (Exception e) { System.out.println("Exception au chargement des personnes: " + e.getMessage()); } } }
//Flux sortie import java.io.*; import java.util.*; public class sortieb { public static void main(String[] args) throws IOException { Personne p = new Personne("name", 55);
File f=new File("Personne.ser"); FileOutputStream fost= new FileOutputStream(f,true); ObjectOutputStream oost = new ObjectOutputStream(fost); int i=0; while (i<5) { System.out.println("i = "+i+ "p="+p); oost.writeObject(p); i+=1; } oost.close(); } }
En fait, je voulais ouvrir le fichier Personne.ser et ajouter des lignes
supplémentaires. Comment faire en mode sérialization ? Est-ce que c'est
possible ou non? Si non quelle est la bonne démarche?
"Joseph KHOURY" <jkhoury@free.fr> a écrit dans le message de news:
43c4984f$0$25665$636a55ce@news.free.fr...
Bonjour,
J'ai 3 classes. La classe Personne implements Serializable et deux classes
pour la gestion des flux (entreeb et sortieb) voir ci joint les
programmes.
Pouvez vous me dire pourquoi lorsque je fais tourner sortieb 2fois, il y a
une exception qui est génère avec entreeb ?
Merci de votre aide
//Classe Personne
import java.io.*;
class Personne implements Serializable {
private String nom;
private int age;
public Personne(String n, int a){
nom = n;
age = a;
}
public void aff() {
System.out.println (nom + " " + age);
}
}
//Flux entree
import java.io.*;
import java.util.*;
public class entreeb {
public static void main(String[] args){
Personne p;
int i=0;
try {
FileInputStream fist= new FileInputStream("Personne.ser");
ObjectInputStream oist = new ObjectInputStream(fist);
try {
while (true) // boucle arreté par l'exception de fin de fichier
{ System.out.println("i="+i);
p = (Personne) oist.readObject();
p.aff();
i++;
}
} catch (EOFException e) { }
oist.close();
} catch (Exception e) {
System.out.println("Exception au chargement des personnes: " +
e.getMessage());
}
}
}
//Flux sortie
import java.io.*;
import java.util.*;
public class sortieb {
public static void main(String[] args) throws IOException {
Personne p = new Personne("name", 55);
File f=new File("Personne.ser");
FileOutputStream fost= new FileOutputStream(f,true);
ObjectOutputStream oost = new ObjectOutputStream(fost);
int i=0;
while (i<5) {
System.out.println("i = "+i+ "p="+p);
oost.writeObject(p);
i+=1;
}
oost.close();
}
}
En fait, je voulais ouvrir le fichier Personne.ser et ajouter des lignes supplémentaires. Comment faire en mode sérialization ? Est-ce que c'est possible ou non? Si non quelle est la bonne démarche?
"Joseph KHOURY" a écrit dans le message de news: 43c4984f$0$25665$
Bonjour,
J'ai 3 classes. La classe Personne implements Serializable et deux classes pour la gestion des flux (entreeb et sortieb) voir ci joint les programmes.
Pouvez vous me dire pourquoi lorsque je fais tourner sortieb 2fois, il y a une exception qui est génère avec entreeb ?
Merci de votre aide
//Classe Personne import java.io.*; class Personne implements Serializable { private String nom; private int age; public Personne(String n, int a){ nom = n; age = a; } public void aff() { System.out.println (nom + " " + age); } }
//Flux entree import java.io.*; import java.util.*; public class entreeb { public static void main(String[] args){ Personne p; int i=0; try { FileInputStream fist= new FileInputStream("Personne.ser"); ObjectInputStream oist = new ObjectInputStream(fist); try { while (true) // boucle arreté par l'exception de fin de fichier { System.out.println("i="+i); p = (Personne) oist.readObject(); p.aff(); i++; } } catch (EOFException e) { } oist.close(); } catch (Exception e) { System.out.println("Exception au chargement des personnes: " + e.getMessage()); } } }
//Flux sortie import java.io.*; import java.util.*; public class sortieb { public static void main(String[] args) throws IOException { Personne p = new Personne("name", 55);
File f=new File("Personne.ser"); FileOutputStream fost= new FileOutputStream(f,true); ObjectOutputStream oost = new ObjectOutputStream(fost); int i=0; while (i<5) { System.out.println("i = "+i+ "p="+p); oost.writeObject(p); i+=1; } oost.close(); } }
S.B
"Joseph KHOURY" a écrit dans le message de news: 43c764b3$0$1245$
En fait, je voulais ouvrir le fichier Personne.ser et ajouter des lignes supplémentaires. Comment faire en mode sérialization ? Est-ce que c'est possible ou non? Si non quelle est la bonne démarche?
Si mes souvenirs sont bon (ça fait assez longtemps que j'ai pas joué avec la sérialisation), il me semble qu'il n'est pas possible d'ajouter des objets dans un flux de sérialisation sans que cela pose de problème. En fait, et toujours si mes souvenirs ne me font pas défaut, la sérialisation d'un type d'objet est optimisée de la façon suivante : 1er objet de type T : - écriture de la description du type T puis - écriture de la valeurs des champs serialisable de l'objet
à partir du 2eme objet de type T : - écriture de la valeur des champs serialisable de l'objet
Cette optimisation est, il me semble, à l'origine du problème rencontré mais ce dernier peut être contourné en forçant l'écriture intégrale de chaque objet (c'est à dire avec son descripteur de type) en écrivant leur représentation binaire dans le flux de sortie, ce qui pourra être fait à l'aide des méthodes ci-dessous. Attention, je n'ai pas testé ces méthodes et compte tenu du problème, le format du flux de sortie doit être une séquence d'élément (size,binary), ou binary correspond à la représentation binaire d'un objet et size la taille de cette représentation (information nécéssaire pour être en mesure d'extraire les objets écrits).
========================================================== Le code ========================================================== // ecrit l'objet (sous forme d'une représentation binaire) spécifié à la // position courante du flux de sortie pOut. public void writeObject(OutputStream pOut, Serializable pObject) throws IOException, {
// création d'une image binaire complète de l'objet à écrire ...
ByteArrayOutputStream lbaos = new ByteArrayOutputStream(); ObjectOutputStream loos = new ObjectOutputStream(lbaos); loos.writeObject(pObject); loos.close();
// écriture de la taille de la représentation binaire puis de celle-ci // dans le flux de sortie... writeInt(pOut,lbaos.size()); lbaos.writeTo(pOut); }
// ecrit la valeur entière spécifiée dans le flux de sortie pOut... private int writeInt(OutputStream pOut, int pValue) { pOut.write((pValue >>> 24) & 0xFF); pOut.write((pValue >>> 16) & 0xFF); pOut.write((pValue >>> 8) & 0xFF); pOut.write((pValue >>> 0) & 0xFF); }
// retourne l'objet stocké (sous forme binaire) à partir de la position // courante du flux d'entrée pIn public Object readObject(InputStream pIn) throws IOException, ClassNotFoundException {
// lecture de la représentation binaire de l'objet à extraire .. int lCount = readInt(pIn); byte[] lbuffer = new byte[lCount];
pIn.read(lbuffer);
// transformation de la représentation binaire en un objet ... ByteArrayInputStream lbais = new ByteArrayInputStream(lbuffer); ObjectInputStream lbois = new ObjectInputStream(lbais);
private int readInt(InputStream pIn) { int lCh1 = in.read(); int lCh2 = in.read(); int lCh3 = in.read(); int lCh4 = in.read(); return ((lCh1 << 24) + (lCh2 << 16) + (lCh3 << 8) + (lCh4 << 0)); }
========================================================== En espérant que cela solutionnera le problème ...
-- S.B
"Joseph KHOURY" <jkhoury@free.fr> a écrit dans le message de news:
43c764b3$0$1245$626a14ce@news.free.fr...
En fait, je voulais ouvrir le fichier Personne.ser et ajouter des lignes
supplémentaires. Comment faire en mode sérialization ? Est-ce que c'est
possible ou non? Si non quelle est la bonne démarche?
Si mes souvenirs sont bon (ça fait assez longtemps que j'ai pas joué avec
la sérialisation), il me semble qu'il n'est pas possible d'ajouter des
objets
dans un flux de sérialisation sans que cela pose de problème. En fait, et
toujours si mes souvenirs ne me font pas défaut, la sérialisation d'un
type d'objet est optimisée de la façon suivante :
1er objet de type T :
- écriture de la description du type T puis
- écriture de la valeurs des champs serialisable de l'objet
à partir du 2eme objet de type T :
- écriture de la valeur des champs serialisable de l'objet
Cette optimisation est, il me semble, à l'origine du problème rencontré
mais ce dernier peut être contourné en forçant l'écriture intégrale de
chaque
objet (c'est à dire avec son descripteur de type) en écrivant leur
représentation binaire dans le flux de sortie, ce qui pourra être fait à
l'aide
des méthodes ci-dessous. Attention, je n'ai pas testé ces méthodes et compte
tenu du problème, le format du flux de sortie doit être une séquence
d'élément
(size,binary), ou binary correspond à la représentation binaire d'un objet
et
size la taille de cette représentation (information nécéssaire pour être en
mesure
d'extraire les objets écrits).
========================================================== Le code
========================================================== // ecrit l'objet (sous forme d'une représentation binaire) spécifié à la
// position courante du flux de sortie pOut.
public void writeObject(OutputStream pOut, Serializable pObject)
throws IOException, {
// création d'une image binaire complète de l'objet à écrire ...
ByteArrayOutputStream lbaos = new ByteArrayOutputStream();
ObjectOutputStream loos = new ObjectOutputStream(lbaos);
loos.writeObject(pObject);
loos.close();
// écriture de la taille de la représentation binaire puis de celle-ci
// dans le flux de sortie...
writeInt(pOut,lbaos.size());
lbaos.writeTo(pOut);
}
// ecrit la valeur entière spécifiée dans le flux de sortie pOut...
private int writeInt(OutputStream pOut, int pValue) {
pOut.write((pValue >>> 24) & 0xFF);
pOut.write((pValue >>> 16) & 0xFF);
pOut.write((pValue >>> 8) & 0xFF);
pOut.write((pValue >>> 0) & 0xFF);
}
// retourne l'objet stocké (sous forme binaire) à partir de la position
// courante du flux d'entrée pIn
public Object readObject(InputStream pIn)
throws IOException, ClassNotFoundException {
// lecture de la représentation binaire de l'objet à extraire ..
int lCount = readInt(pIn);
byte[] lbuffer = new byte[lCount];
pIn.read(lbuffer);
// transformation de la représentation binaire en un objet ...
ByteArrayInputStream lbais = new ByteArrayInputStream(lbuffer);
ObjectInputStream lbois = new ObjectInputStream(lbais);
"Joseph KHOURY" a écrit dans le message de news: 43c764b3$0$1245$
En fait, je voulais ouvrir le fichier Personne.ser et ajouter des lignes supplémentaires. Comment faire en mode sérialization ? Est-ce que c'est possible ou non? Si non quelle est la bonne démarche?
Si mes souvenirs sont bon (ça fait assez longtemps que j'ai pas joué avec la sérialisation), il me semble qu'il n'est pas possible d'ajouter des objets dans un flux de sérialisation sans que cela pose de problème. En fait, et toujours si mes souvenirs ne me font pas défaut, la sérialisation d'un type d'objet est optimisée de la façon suivante : 1er objet de type T : - écriture de la description du type T puis - écriture de la valeurs des champs serialisable de l'objet
à partir du 2eme objet de type T : - écriture de la valeur des champs serialisable de l'objet
Cette optimisation est, il me semble, à l'origine du problème rencontré mais ce dernier peut être contourné en forçant l'écriture intégrale de chaque objet (c'est à dire avec son descripteur de type) en écrivant leur représentation binaire dans le flux de sortie, ce qui pourra être fait à l'aide des méthodes ci-dessous. Attention, je n'ai pas testé ces méthodes et compte tenu du problème, le format du flux de sortie doit être une séquence d'élément (size,binary), ou binary correspond à la représentation binaire d'un objet et size la taille de cette représentation (information nécéssaire pour être en mesure d'extraire les objets écrits).
========================================================== Le code ========================================================== // ecrit l'objet (sous forme d'une représentation binaire) spécifié à la // position courante du flux de sortie pOut. public void writeObject(OutputStream pOut, Serializable pObject) throws IOException, {
// création d'une image binaire complète de l'objet à écrire ...
ByteArrayOutputStream lbaos = new ByteArrayOutputStream(); ObjectOutputStream loos = new ObjectOutputStream(lbaos); loos.writeObject(pObject); loos.close();
// écriture de la taille de la représentation binaire puis de celle-ci // dans le flux de sortie... writeInt(pOut,lbaos.size()); lbaos.writeTo(pOut); }
// ecrit la valeur entière spécifiée dans le flux de sortie pOut... private int writeInt(OutputStream pOut, int pValue) { pOut.write((pValue >>> 24) & 0xFF); pOut.write((pValue >>> 16) & 0xFF); pOut.write((pValue >>> 8) & 0xFF); pOut.write((pValue >>> 0) & 0xFF); }
// retourne l'objet stocké (sous forme binaire) à partir de la position // courante du flux d'entrée pIn public Object readObject(InputStream pIn) throws IOException, ClassNotFoundException {
// lecture de la représentation binaire de l'objet à extraire .. int lCount = readInt(pIn); byte[] lbuffer = new byte[lCount];
pIn.read(lbuffer);
// transformation de la représentation binaire en un objet ... ByteArrayInputStream lbais = new ByteArrayInputStream(lbuffer); ObjectInputStream lbois = new ObjectInputStream(lbais);