2010-12-27 2 views
-2

Je sais que c'est une tâche facile, mais après avoir changé mon code, il a cessé de fonctionner et je ne peux pas le récupérer! J'utilise deux fonctions zip et décompressez, même si ce qu'il fait est « pot » et « unjar », mais cela ne devrait pas faire une énorme différencezip et unzip en Java

public static void zipit(File[] infiles, JarOutputStream jos) throws Exception 
    { 
     zipit(infiles,"", jos); 
    } 

    public static void zipit(File[] infiles, String root, JarOutputStream jos) throws Exception 
    { 

     byte[] buffer = new byte[4096]; 

     for(int i=0; i<infiles.length; i++) 
     { 
     // recursive call for subfolders... temporary 
     if(infiles[i].isDirectory()) 
     { 
      zipit(infiles[i].listFiles(), infiles[i].getName() + "/", jos); 
      continue; 
     } 

     // create string with absolute path 
     String entryfile = root + infiles[i].getName(); 

     JarEntry entry = new JarEntry(entryfile); 
     zos.putNextEntry(entry); 

     FileInputStream fis = new FileInputStream(infiles[i]); 

     int count; 
     while((count = fis.read(buffer, 0, buffer.length)) != -1) 
      zos.write(buffer, 0, count); 
     } 
    } 

    public static void unzipit(File zipfile, File outputfolder) throws Exception 
    { 
     JarFile jar = new JarFile(zipfile); 

     for(Enumeration entries = jar.entries(); entries.hasMoreElements();) 
     { 
     JarEntry entry = (JarEntry) entries.nextElement(); 
     File unzipped = new File(outputfolder, entry.getName()); 
     if (entry.isDirectory() && !unzipped.exists()) 
     { 
      unzipped.mkdirs(); 
      continue; 
     } 
     else if (!unzipped.getParentFile().exists()) 
      unzipped.getParentFile().mkdirs(); 

     FileOutputStream fos = new FileOutputStream(unzipped); 
     InputStream in = jar.getInputStream(entry); 

     byte[] buffer = new byte[4096]; 
     int count; 
     while((count = in.read(buffer, 0, buffer.length)) != -1) 
      fos.write(buffer, 0, count); 
     fos.close(); 
     } 
    } 

Toute aide/suggestions?

L'erreur se produit lors de la création du fichier Jar:

java.util.zip.ZipException: error in opening zip file 
    at java.util.zip.ZipFile.open(Native Method) 
    at java.util.zip.ZipFile.<init>(ZipFile.java:131) 
    at java.util.jar.JarFile.<init>(JarFile.java:150) 
    at java.util.jar.JarFile.<init>(JarFile.java:114) 
+3

Qu'avez-vous modifié? Peut-être devriez-vous envisager d'utiliser le contrôle de la source. –

+1

Qu'est-ce qui ne fonctionne pas exactement? "Stopped working" ne suffit pas – unbeli

+0

Je ne faisais que tester la fonction unzip, mais quand j'essaie de décompresser quelque chose précédemment zippé avec la fonction zip, il crache l'erreur – omtinez

Répondre

1

Je ne sais pas si cela est votre problème ou non, mais il est généralement une bonne pratique de fermer chaque entrée zip après avoir terminé l'écriture.

Voir ZipOutputStream.closeEntry().

Dans le code que vous affichez, la toute dernière entrée dans le zip ne serait pas fermée. Vous ne montrez pas non plus où vous fermez le JarOutputStream lui-même. Cela peut être à l'origine de la création de fichiers zip incorrects, ce qui entraînerait des erreurs lors de la relecture de votre autre méthode.

+0

c'était ma conjecture, mais je l'ai testé dans le principal, et même quand je ferme tous les flux et les fichiers zip cela ne fonctionne pas – omtinez

+1

@omtinez, je suis content que vous avez résolu votre problème. Si la fermeture du flux était la réponse, alors la manière habituelle de faire des choses sur StackOverflow est aussi d'accepter la bonne réponse comme solution. Le fait de repasser l'extrait de code avec le changement de 2 lignes en tant que réponse distincte n'est pas la façon dont les choses sont généralement faites. –

+0

je vous remercie pour votre compréhension, je fais paraître assez évident que je suis assez nouveau dans stackoverflow mais je vais essayer d'améliorer cela – omtinez

3

D'une manière ou d'une autre, je l'ai eu fonctionné, apparemment c'était lié au courant ... merci pour l'aide, tout le monde!

class zipper 
{ 
    static byte[] buffer = new byte[4096]; 

    public static void unzip(File zipfile, File outputfolder) throws Exception 
    { 
     JarFile zip = new JarFile(zipfile); 

     Enumeration entries = zip.entries(); 
     while(entries.hasMoreElements()) 
     { 
      JarEntry entry = (JarEntry) entries.nextElement(); 
      File unzipped = new File(outputfolder,entry.getName()); 

      if (entry.isDirectory() && !unzipped.exists()) 
      { 
       unzipped.mkdirs(); 
       continue; 
      } 
      else if (!unzipped.getParentFile().exists()) 
       unzipped.getParentFile().mkdirs(); 

      InputStream in = zip.getInputStream(entry); 
      FileOutputStream fos = new FileOutputStream(unzipped); 

      int count; 
      while((count = in.read(buffer, 0, buffer.length)) != -1) 
       fos.write(buffer, 0, count); 

      // clean up 
      fos.close(); 
      in.close(); 
     } 
    } 

    public static void zip(File[] infiles, JarOutputStream jos) throws Exception 
    { 
     zip(infiles,"",jos); 

     // clean up 
     jos.flush(); 
     jos.close(); 
    } 

    public static void zip(File[] infiles, String basefolder, JarOutputStream jos) throws Exception 
    { 
     for(int i=0; i<infiles.length; i++) 
     { 
      if(infiles[i].isDirectory()) 
      { 
       // recursive call for directories 
       zip(infiles[i].listFiles(), infiles[i].getName() + File.separator, jos); 
       continue; 
      } 

      String filepath = basefolder + infiles[i].getName(); 
      JarEntry entry = new JarEntry(filepath); 
      jos.putNextEntry(entry); 

      FileInputStream fis = new FileInputStream(infiles[i]); // get stream 

      int count; 
      while((count = fis.read(buffer, 0, buffer.length)) != -1) 
       jos.write(buffer, 0, count); 
     } 
    } 
} 
+0

Merci pour l'affichage de cela, je devais aller à certaines sources farcies dans un pot. --dan –

Questions connexes