Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3001 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  Problème avec ZipFile et InputStream

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Problème avec ZipFile et InputStream

n°589630
yo c spi
Yo !
Posté le 12-12-2003 à 21:33:16  profilanswer
 

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

mood
Publicité
Posté le 12-12-2003 à 21:33:16  profilanswer
 

n°590019
Shaman-Yo
Posté le 13-12-2003 à 17:41:29  profilanswer
 

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
n°590336
Cherrytree
cn=?
Posté le 14-12-2003 à 11:17:35  profilanswer
 

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
n°590391
yo c spi
Yo !
Posté le 14-12-2003 à 14:06:25  profilanswer
 

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!

n°590419
Cherrytree
cn=?
Posté le 14-12-2003 à 14:58:16  profilanswer
 

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
n°590442
yo c spi
Yo !
Posté le 14-12-2003 à 15:21:11  profilanswer
 

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
n°590490
Cherrytree
cn=?
Posté le 14-12-2003 à 16:09:22  profilanswer
 

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
n°590673
R3g
fonctionnaire certifié ITIL
Posté le 14-12-2003 à 20:05:48  profilanswer
 

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.
n°590674
Cherrytree
cn=?
Posté le 14-12-2003 à 20:16:50  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  Problème avec ZipFile et InputStream

 

Sujets relatifs
Problème avec for_eachprobleme sql avec insert into
SHELL/TCSH : Probleme sur un script automatiqueexif_imagetype probleme
[C] Probleme exec dans un fork :Dproblème avec les la transformation de lien en BBCode
[PHP] Probleme avec DOMXMLProbleme avec Java
Probleme d'heritage et de surcharge en C#fonction mail, base de données, variable, petit problème!
Plus de sujets relatifs à : Problème avec ZipFile et InputStream


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR