Jar и молнии, это не один и тот же размер - PullRequest
1 голос
/ 16 января 2011

Я делаю моддинг приложение для игры.Когда я разархивирую и заархивирую одни и те же файлы: по какой-то причине, хотя он может быть открыт с помощью 7Zip, он не может быть открыт в реальном приложении.Несмотря на то, что я не редактировал разархивированные файлы - в нем пропущено несколько байтов.Я собрал методы из сети и последние 5 часов редактировал и повторял попытки, но безуспешно, парни?Спасибо!

Вот мой код:

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
   {
        FileInputStream fis = null;
       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);

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

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

1 Ответ

0 голосов
/ 16 января 2011

Без отладки вашего кода могу сказать, что наиболее вероятная причина - это уровень сжатия. Уровень сжатия по умолчанию - Deflater.DEFAULT_COMPRESSION. Вы можете изменить его, используя ZipOutputStream.setLevel ().

Я полагаю, что вы создали свой оригинальный файл jar с помощью утилиты jar или другого создателя zip. Затем вы создали то же самое с помощью своего кода и получили другой размер. В этом случае уровень сжатия может объяснить разницу.

...