有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

jar压缩和解压在java中

我知道这是一项简单的任务,但在更改代码后,它停止了工作,我无法恢复!我使用两个函数来压缩和解压,尽管它实际上做的是“jar”和“unjar”,但这不会有太大的区别

   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();
      }
   }

有什么帮助/建议吗

创建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)

共 (2) 个答案

  1. # 1 楼答案

    我不知道这是否是你的问题,但通常在写完文章后关闭每个zip条目是一种很好的做法

    ^{}

    在您显示的代码中,zip中的最后一个条目不会被关闭。您也不会显示关闭JarOutputStream本身的位置。这可能会导致您创建无效的zip文件,当使用其他方法读回这些文件时,会出现错误

  2. # 2 楼答案

    不知怎么的,我让它工作了,很明显它与流有关。。。谢谢大家的帮助

    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);
           }
       }
    }