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

  FORUM HardWare.fr
  Programmation
  Java

  Probleme de taille avec ZipInputStream

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Probleme de taille avec ZipInputStream

n°554610
yo c spi
Yo !
Posté le 30-10-2003 à 16:02:27  profilanswer
 

Salut !
 
J'ai un problème lors de la création de fichiers zippé en Java (avec ZipOutputStream).
Lors de la lecture du fichier encodé, si le fichier est compressé (DEFLATED), je n'arrive pas a bien le relire car le ZipEntry que je prends ne me renvoie pas de taille (-1).
Je fais pourtant la méthode ZipEntry.setSize() a la création mais je ne peux pas faire de setCompressedSize(), ne connaissant pas la taille une fois compressé.
 
Comment faire pour compresser les fichiers et récupérer la bonne taille?
 
Merci!

mood
Publicité
Posté le 30-10-2003 à 16:02:27  profilanswer
 

n°554612
darklord
You're welcome
Posté le 30-10-2003 à 16:03:46  profilanswer
 

euh c'est un peu brouillon j'ai pas compris. Tu arrives à créer une archive zip ou pas? tu peux l'ouvrir avec un soft annexe (genre winzip)


---------------
Just because you feel good does not make you right
n°554629
nerisson
Pic-pic
Posté le 30-10-2003 à 16:24:16  profilanswer
 

Il n'y a pas besoin de faire un setSize() pour ecrire ni un getSize() pour lire.
Ca se manipule comme un OutputStream normal.
Si tu veux j'ai un classe qui ecris un fichier ZIP a la volée.


Message édité par nerisson le 30-10-2003 à 16:26:46

---------------
Light is right
n°555903
Shaman-Yo
Posté le 31-10-2003 à 21:26:57  profilanswer
 

DarkLord : je sais que c'est un peu brouillon, mais oui, je fais des fichiers Zip lisibles.
 
Je me sert de getSize() pour recréer mon tableau de bytes de bonne taille a la lecture c'est pour ca. Mais c'est bizarre que ca marche quand c'est pas zippé (level 0 - STORED) et pas quand c'est compressé (level 9 - DEFLATED).
 
Merci, je vais faire autrement pour recréer mon tableau de bytes.
 
Edit : y'a beau avoir marqué Shaman Yo comme pseudo, c'est bien la meme personne, Yo C Spi


Message édité par Shaman-Yo le 02-11-2003 à 02:46:16
n°557297
nerisson
Pic-pic
Posté le 03-11-2003 à 09:23:29  profilanswer
 

Bon alors voici un petit exemple d'une classe permettant d'ecrire un fichier ZIP a la volee:
 

Code :
  1. public final class ZipFileWriter extends FileWriter {
  2.   /** Flux de sortie. */
  3.   private ZipOutputStream zip;
  4.   /** Buffer d'ecriture de 16Ko. */
  5.   private static final int BUFFER_SIZE = 16 * 1024;
  6.   /**
  7.    * Constructeur. <br>
  8.    * @param file nom du fichier
  9.    * @throws IOException en cas d'erreur
  10.    */
  11.   public ZipFileWriter(final File file) throws IOException {
  12.     super(file);
  13.     initZIP(file.getCanonicalPath());
  14.   }//end ZipFileWriter
  15.   /**
  16.    * M&eacute;thode non support&eacute;e. <br>
  17.    * @param fd descripteur du fichier
  18.    * @throws IOException en cas d'erreur
  19.    */
  20.   public ZipFileWriter(final FileDescriptor fd) throws IOException {
  21.     super("" );
  22.     throw new UnsupportedOperationException();
  23.   }//end ZipFileWriter
  24.   /**
  25.    * M&eacute;thode non support&eacute;e. <br>
  26.    * @param fileName nom du fichier
  27.    * @param append indique si l'on ajoute les donnees a la fin du fichier
  28.    * @throws IOException en cas d'erreur
  29.    */
  30.   public ZipFileWriter(final String fileName, boolean append) throws IOException {
  31.     super("" );
  32.     throw new UnsupportedOperationException();
  33.   }//end ZipFileWriter
  34.   /**
  35.    * Constructeur. <br>
  36.    * @param fileName nom du fichier
  37.    * @throws IOException en cas d'erreur
  38.    */
  39.   public ZipFileWriter(final String fileName) throws IOException {
  40.     super(fileName);
  41.     initZIP(fileName);
  42.   }//end ZipFileWriter
  43.   /**
  44.    * Initialise le fichier. <br>
  45.    * @param compressedFile nom du fichier compress&eacute;
  46.    * @throws IOException en cas d'erreur
  47.    */
  48.   private void initZIP(final String compressedFile) throws IOException {
  49.     /* Cree le flux de sortie */
  50.     final FileOutputStream fos = new FileOutputStream(compressedFile);
  51.     final BufferedOutputStream bos = new BufferedOutputStream(fos, BUFFER_SIZE);
  52.     zip = new ZipOutputStream(bos);
  53.     /* Prepare le zip */
  54.     final String fileName = compressedFile.substring(0, compressedFile.length()-4);
  55.     final ZipEntry entry = new ZipEntry(fileName);
  56.     entry.setMethod(ZipEntry.DEFLATED);
  57.     zip.putNextEntry(entry);
  58.   }//end initZIP
  59.   /**
  60.    * Force l'&eacute;criture des donn&eacute;es en purgeant le cache. <br>
  61.    * @throws IOException en cas d'erreur
  62.    */
  63.   public void flush() throws IOException {
  64.     zip.flush();
  65.   }//end flush
  66.   /**
  67.    * Ferme le zip. <br>
  68.    * @throws IOException en cas d'erreur
  69.    */
  70.   public void close() throws IOException {
  71.     try {
  72.       zip.flush();
  73.     } catch(final IOException excpt) {
  74.     }//end try
  75.     zip.close();
  76.     super.close();
  77.   }//end close
  78.   /**
  79.    * Envoie la chaine dans le fichier ZIP. <br>
  80.    * @param str la chaine
  81.    * @throws IOException en cas d'erreur
  82.    */
  83.   public void write(final String str) throws IOException {
  84.     zip.write(str.getBytes());
  85.   }//end write
  86.   /**
  87.    * Envoie le tableau de caracteres dans le fichier ZIP. <br>
  88.    * @param str le tableau de caracteres
  89.    * @throws IOException en cas d'erreur
  90.    */
  91.   public void write(final char[] str) throws IOException {
  92.     byte[] tab = new byte[str.length];
  93.     for(int i=0;i<str.length;i++)
  94.       tab[i] = (byte)str[i];
  95.     zip.write(tab);
  96.   }//end write
  97.   /**
  98.    * Envoie le caractere dans le fichier ZIP. <br>
  99.    * @param c le caractere
  100.    * @throws IOException en cas d'erreur
  101.    */
  102.   public void write(final int c) throws IOException {
  103.     zip.write(c);
  104.   }//end write
  105.   /**
  106.    * Envoie le tableau de caracteres dans le fichier ZIP. <br>
  107.    * @param str le tableau de caracteres
  108.    * @param off indice de debut des donnees
  109.    * @param len longueur des donnees
  110.    * @throws IOException en cas d'erreur
  111.    */
  112.   public void write(final char[] str, final int off, final int len) throws IOException {
  113.     byte[] tab = new byte[len];
  114.     final int max = off+len;
  115.     for(int i=off;i<max;i++)
  116.       tab[i-off] = (byte)str[i-off];
  117.     zip.write(tab);
  118.   }//end write
  119.   /**
  120.    * Envoie la chaine dans le fichier ZIP. <br>
  121.    * @param str la chaine
  122.    * @param off indice de debut des donnees
  123.    * @param len longueur des donnees
  124.    * @throws IOException en cas d'erreur
  125.    */
  126.   public void write(final String str, int off, int len) throws IOException {
  127.     final String s = str.substring(off, off+len);
  128.     zip.write(s.getBytes());
  129.   }//end write
  130.   /**
  131.    * Destructeur. <br>
  132.    * @throws Throwable en cas d'erreur
  133.    */
  134.   protected void finalize() throws Throwable {
  135.     super.finalize();
  136.   }//end finalize
  137. }//end ZipFileWriter


 
Patapé si le code n'est pa bo !


---------------
Light is right
n°557304
darklord
You're welcome
Posté le 03-11-2003 à 09:38:54  profilanswer
 

ah non il a l'air top au contraire :jap:
 
Edit: euh on fait comment pour ajouter des fichiers au juste :D


Message édité par darklord le 03-11-2003 à 09:40:14

---------------
Just because you feel good does not make you right
n°557902
yo c spi
Yo !
Posté le 03-11-2003 à 17:49:42  profilanswer
 

Je crois que je me suis mal fait comprendre (en meme temps c'est normal vu les explications que j'ai donné, je pensais que ton code m'aiderai Nerrisson mais non.
Je résume :
 
Je n'ai aucun problème pour créer un zip, mais voila comment je fais (simplifié) :

Code :
  1. //j'ai un tableau de bytes input
  2. //et un OutputStream out
  3. ZipOutputStream zos = new ZipOutputStream(out);
  4. // Définition de la compression
  5. zos.setMethod(ZipOutputStream.DEFLATED);
  6. zos.setLevel(9);
  7. ZipEntry entry = new ZipEntry("pouet" );
  8. entry.setSize(input.length);
  9. zos.putNextEntry(entry);
  10. zos.write(input, 0, input.length);


 
Mais c'est pour lire le zip ainsi créé que j'ai des problèmes :

Code :
  1. ZipInputStream zis = new ZipInputStream(in);
  2. ZipEntry entry = zis.getNextEntry()
  3. byte[] output = new Byte[entry.getSize()]; //=> c'est là le bug !!!
  4. .....


 
La methode getSize() me renvoie '-1' et ce uniquement quand je créé des Zip avec une compression (qui est bien effective, les fichiers sont plus petits que la normale), si les données sont juste stockées dans un Zip, le problème ne se montre pas.
 
Merci !
(Si vous ne comprenez encore pas, n'hésitez pas a le dire mais je dois faire mes posts sans le code sous les yeux)

n°557909
Taiche
(╯°□°)╯︵ ┻━┻
Posté le 03-11-2003 à 17:59:02  profilanswer
 

Bon ba j'ai testé ton bout de code pour lire et euh... j'ai pas de problème !
J'ai fait ce truc rapidos en 1.4 et ça marche nickel :

Code :
  1. public class Grabadaou
  2. {
  3. public static void main(String[] args)
  4. {
  5.  try {
  6.  FileInputStream in = new FileInputStream("E:\\dev.zip" );
  7.  ZipInputStream zis = new ZipInputStream(in);
  8.  ZipEntry entry = zis.getNextEntry();
  9.  System.out.println(entry.getSize());
  10.  }
  11.  catch(Exception e)
  12.  {
  13.   e.printStackTrace();
  14.  }
  15. }
  16. }


 
Donc ça doit être ton écriture qui foire [:spamafote]


Message édité par Taiche le 03-11-2003 à 17:59:44

---------------
Everyone thinks of changing the world, but no one thinks of changing himself  |  It is the peculiar quality of a fool to perceive the faults of others and to forget his own  |  Early clumsiness is not a verdict, it’s an essential ingredient.
n°557919
Taiche
(╯°□°)╯︵ ┻━┻
Posté le 03-11-2003 à 18:12:43  profilanswer
 

Ah ouais non. Chu en train de tester le merdier, c'est vrai que c'est bien laid et que ça pue. WinZip trouve bien le truc une fois écrit et tout mais pour le lire, ZipInputStream retrouve bien le nom nais pas la taille :??: Alors qu'il y arrive avec un fichier ZIP à moi...
Ca sent mauvais :D
 
EDIT : ouais bin j'confirme, c'est lors de l'écriture, le setSize() a pas l'air de faire son taf :??: La taille n'est pas écrite dans le .zip final, donc forcément, le getSize() retourne -1. Y a pu qu'à trouver pourquoi ça se fait pas lors de l'écriture :D


Message édité par Taiche le 03-11-2003 à 18:24:21

---------------
Everyone thinks of changing the world, but no one thinks of changing himself  |  It is the peculiar quality of a fool to perceive the faults of others and to forget his own  |  Early clumsiness is not a verdict, it’s an essential ingredient.
n°557954
Taiche
(╯°□°)╯︵ ┻━┻
Posté le 03-11-2003 à 18:33:42  profilanswer
 

Trouvé \o/
La réponse est là : http://mindprod.com/jgloss/zip.html

Citation :


ZipOutputStream produces a slighly non-standard format. ZipOutputStream puts the compressed and uncompressed size and CRC after the data, instead of in the local header just in front of it. Unfortuately, when you come to read this file with ZipInputStream, when you do an ZipEntry.getSize() you will get 0, because ZipInputStream is a stream, and can't look ahead to find it. There is a second copy of the header put at the end of the file forming an index. ZipFile is able to use this index to randomly access the file to read individual elements.


Moralité : toujours utiliser ZipFile pour lire les fichiers Zip.
 
EDIT : un pitit bout de code qui marche pour avoir des bons points :o

Code :
  1. ZipFile zip = new ZipFile("E:\\miaou.zip" );
  2.  Enumeration enum = zip.entries();
  3.  while(enum.hasMoreElements())
  4.  {
  5.   ZipEntry entryRead = (ZipEntry)enum.nextElement();
  6.   System.out.println(entryRead.getName() + " : " + entryRead.getSize());
  7.  }
  8.  zip.close();


Message édité par Taiche le 03-11-2003 à 18:38:19

---------------
Everyone thinks of changing the world, but no one thinks of changing himself  |  It is the peculiar quality of a fool to perceive the faults of others and to forget his own  |  Early clumsiness is not a verdict, it’s an essential ingredient.
mood
Publicité
Posté le 03-11-2003 à 18:33:42  profilanswer
 

n°558802
yo c spi
Yo !
Posté le 04-11-2003 à 16:39:50  profilanswer
 

Ok merci a tous!
 
2 questions :
1 - Nerisson, pourquoi utilises-tu un BufferedInputStream?
2 - Il y a dans ZipInputStream et ZipEntry le methode setMethod(int).
Laquelle définit le type de compression exactement? J'ai cru comprendre que celle de ZipEntry prédominait sur celle de ZipInputStream. Est-ce exact?
 
Merci.

n°558808
Taiche
(╯°□°)╯︵ ┻━┻
Posté le 04-11-2003 à 16:44:45  profilanswer
 

Yo c Spi a écrit :

Ok merci a tous!
2 - Il y a dans ZipInputStream et ZipEntry le methode setMethod(int).
Laquelle définit le type de compression exactement? J'ai cru comprendre que celle de ZipEntry prédominait sur celle de ZipInputStream. Est-ce exact?


C'est dans ZipOutputStream [:aloy]
Bin je dirais que normalement ça s'applique à une ZipEntry mais que si elle n'est pas settée dans l'objet, alors c'est celle du ZipOutputStream qui sera utilisée. C'est d'ailleurs ce qui est dit dans la javadoc :

Citation :

This default will be used whenever the compression method is not specified for an individual ZIP file entry


---------------
Everyone thinks of changing the world, but no one thinks of changing himself  |  It is the peculiar quality of a fool to perceive the faults of others and to forget his own  |  Early clumsiness is not a verdict, it’s an essential ingredient.
n°558843
nerisson
Pic-pic
Posté le 04-11-2003 à 17:44:15  profilanswer
 

Yo c Spi a écrit :

Ok merci a tous!
 
2 questions :
1 - Nerisson, pourquoi utilises-tu un BufferedInputStream?
2 - Il y a dans ZipInputStream et ZipEntry le methode setMethod(int).
Laquelle définit le type de compression exactement? J'ai cru comprendre que celle de ZipEntry prédominait sur celle de ZipInputStream. Est-ce exact?
 
Merci.


Euh, c'est un BufferedOutputStream.
Ca sert a ameliorer les performances en utilisant un buffer d'ecriture.


---------------
Light is right

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

  Probleme de taille avec ZipInputStream

 

Sujets relatifs
problème con : recupérer une variable passée en paramètreProblème d'affichage d'états sous excel depuis access
[PHP-NEWB] Probleme de session avec hébergement lycosProblème lié à replace.
petit probleme de breakproblème avec la commande systeme(" ")
[RESOLU] [ou presque] Problème de taille de JPanelProbleme avec Jpanel
problème avec 'operator type();' : ambiguité 
Plus de sujets relatifs à : Probleme de taille avec ZipInputStream


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