Problème avec ZipFile et InputStream

Problème avec ZipFile et InputStream - Java - Programmation

Marsh Posté le 12-12-2003 à 21:33:16    

Salut!
 
Voila, je cherche a ouvrir un fichier zippé mais ai quelques petits problèmes.
Je zippe des données avec mon appli, elles sont correctes, mais je n'arrive pas à les lire.
Lorsque je fais : in.read(), je ne récupère qu'une partie des données, la taille des données récupérées ne correspont pas à la taille du fichier ni à la taille de celui-ci compressé.
 
Puisqu'ici, j'extrais un XML, je me retrouve avec un "demi" XML.
 
Voici mon code :

Code :
  1. // Lecture du XML
  2.             ZipEntry xmlEntry = zip.getEntry("datas.xml" );
  3.             if(xmlEntry == null)  throw new DataFormatException("Bad type file" );
  4.            
  5.             byte[] xmlBytes = new byte[(int)xmlEntry.getSize()];
  6.             InputStream in = zip.getInputStream(xmlEntry);
  7.            
  8.             int size = in.read(xmlBytes, 0, xmlBytes.length);
  9.             in.close();


 
Merci

Reply

Marsh Posté le 12-12-2003 à 21:33:16   

Reply

Marsh Posté le 13-12-2003 à 17:41:29    

J'ai trouvé, mais je ne comprends pas pourquoi. :
 
Voici le nouveau code :  

Code :
  1. // Lecture du XML
  2.            ZipEntry xmlEntry = zip.getEntry("datas.xml" );
  3.            if(xmlEntry == null)  throw new DataFormatException("Bad type file" );
  4.          
  5.            byte[] xmlBytes = new byte[(int)xmlEntry.getSize()];
  6.            InputStream in = zip.getInputStream(xmlEntry);
  7.            BufferedInputStream bin = new BufferedInputStream(in);
  8.            int size = bin.read(xmlBytes, 0, xmlBytes.length);
  9.            in.close();
  10.            bin.close();

 
 
Est-ce que quelqu'un pourrait m'expliquer pourquoi cette solution fonctionne et pas l'autre. Ce serait gentil. :)
 
Merci!
 
Edit : mon pseudo a beau etre Shaman-Yo, je suis le posteur originel : Yo C Spi.


Message édité par Shaman-Yo le 13-12-2003 à 17:54:47
Reply

Marsh Posté le 14-12-2003 à 11:17:35    

Pour l'instant, je ne sais pas. Peux-tu nous dire la taille de ton fichier XML, zippé comme non zippé ?


---------------
Le site de ma maman
Reply

Marsh Posté le 14-12-2003 à 14:06:25    

XML non compressé : 5838 octets
compressé : 909
 
Sans le BufferedInputStream, les octets extraits étaient de l'ordre de 2000.
 
Dans ce zip, il y avait aussi des images, leur taille est comprise entre 5 ett 7Ko (compression quasi nulle, ce sont des JPG), et le problème était le meme.
 
Merci!

Reply

Marsh Posté le 14-12-2003 à 14:58:16    

Dans le premier bout de code, si tu fais un System.out.println(size), qu'est-ce que ça affiche ? et dans le deuxième cas ?


---------------
Le site de ma maman
Reply

Marsh Posté le 14-12-2003 à 15:21:11    

xmlEntry.getSize() => 5838
xmlEntry.getCompressedSize() => 909
(Les données sont les meme avec WinRar, donc correctes)
 
Dans le premier cas :
size => environ 2000 !!! (je sais plus trop mais c'est pas du tout le résultat attendu)
J'ai donc mon tableau xmlBytes de taille 5838 qui n'est pas rempli en entier.
 
Dans le deuxième cas :
size => 5838
 
PS : j'ai hate de voir la section sur la bonne création d'interface graphiques en Java sur ton site, je me pose bcp de questions a ce sujet.


Message édité par yo c spi le 14-12-2003 à 15:23:02
Reply

Marsh Posté le 14-12-2003 à 16:09:22    

Sur Swing, j'ai des trucs à écrire en effet.
 
Quel JDK utilises-tu ? Le code source (en 1.4.2) de la methode read(byte[], int, int) de la classe InputStream est :
 

Code :
  1. public int read(byte b[], int off, int len) throws IOException {
  2. if (b == null) {
  3.     throw new NullPointerException();
  4. } else if ((off < 0) || (off > b.length) || (len < 0) ||
  5.     ((off + len) > b.length) || ((off + len) < 0)) {
  6.     throw new IndexOutOfBoundsException();
  7. } else if (len == 0) {
  8.     return 0;
  9. }
  10. int c = read();
  11. if (c == -1) {
  12.     return -1;
  13. }
  14. b[off] = (byte)c;
  15. int i = 1;
  16. try {
  17.     for (; i < len ; i++) {
  18.  c = read();
  19.  if (c == -1) {
  20.      break;
  21.  }
  22.  if (b != null) {
  23.      b[off + i] = (byte)c;
  24.  }
  25.     }
  26. } catch (IOException ee) {
  27. }
  28. return i;
  29.     }


 
Cela pourrait valoir le coup d'incorporer cette méthode dans une classe utilitaire et de tracer ce qui se passe, histoire de comprendre. Pour l'instant, je sèche.


Message édité par Cherrytree le 14-12-2003 à 16:09:46

---------------
Le site de ma maman
Reply

Marsh Posté le 14-12-2003 à 20:05:48    

Code :
  1. int i = 1;
  2.      try {
  3.            for (; i < len ; i++) {
  4.           c = read();
  5.           if (c == -1) {
  6.                 break;
  7.           }
  8.           if (b != null) {
  9.                 b[off + i] = (byte)c;
  10.           }
  11.            }
  12.        } catch (IOException ee) {
  13.      }


Ca n'a rien a voir mais à quoi il sert le "if (b != null)" à chaque iteration alors qu'il a deja été fait au debut de la methode ?


---------------
Au royaume des sourds, les borgnes sont sourds.
Reply

Marsh Posté le 14-12-2003 à 20:16:50    

R3g a écrit :

Code :
  1. int i = 1;
  2.      try {
  3.            for (; i < len ; i++) {
  4.           c = read();
  5.           if (c == -1) {
  6.                 break;
  7.           }
  8.           if (b != null) {
  9.                 b[off + i] = (byte)c;
  10.           }
  11.            }
  12.        } catch (IOException ee) {
  13.      }


Ca n'a rien a voir mais à quoi il sert le "if (b != null)" à chaque iteration alors qu'il a deja été fait au debut de la methode ?


Pas à grand chose. Envoyons un mail d'injures à Arthur van Hoff, l'auteur de cette classe !


---------------
Le site de ma maman
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed