Java 拉链和拉链罐,它';It’大小不一样!

Java 拉链和拉链罐,它';It’大小不一样!,java,jar,zip,unzip,Java,Jar,Zip,Unzip,我正在制作一个游戏的修改应用程序。当我解压和压缩相同的文件时:出于某种原因,尽管它可以用7Zip打开,但在实际应用程序中却无法打开。即使我没有编辑解压后的文件,也会丢失一些字节。 我从网上收集了这些方法,在过去的5个小时里一直在编辑和重试,但都没有成功,有什么帮助吗?谢谢 这是我的密码: class zipper { static byte[] buffer = new byte[4096]; public static void unzip(File zipfile, F

我正在制作一个游戏的修改应用程序。当我解压和压缩相同的文件时:出于某种原因,尽管它可以用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);
       }
   }
}
class拉链
{
静态字节[]缓冲区=新字节[4096];
公共静态无效解压缩(文件zipfile、文件outputfolder)引发异常
{
JarFile zip=新的JarFile(zipfile);
枚举条目=zip.entries();
while(entries.hasMoreElements())
{
JarEntry=(JarEntry)entries.nextElement();
File unzip=新文件(outputfolder,entry.getName());
if(entry.isDirectory()&&!unzip.exists())
{
解压缩的.mkdirs();
继续;
}
如果(!unzip.getParentFile().exists())存在,则为else
解压缩的.getParentFile().mkdirs();
InputStream in=zip.getInputStream(条目);
FileOutputStream fos=新的FileOutputStream(解压缩);
整数计数;
while((count=in.read(buffer,0,buffer.length))!=-1)
fos.写入(缓冲区,0,计数);
//清理
fos.close();
in.close();
}
}
公共静态void zip(文件[]infiles,JarOutputStream jos)引发异常
{
拉链(填充“”,jos);
//清理
jos.flush();
jos.close();
}
公共静态void zip(文件[]infiles、字符串basefolder、JarOutputStream jos)引发异常
{
FileInputStream fis=null;

对于(int i=0;i,在不调试代码的情况下,我可以说最可能的原因是压缩级别。默认压缩级别是Deflater.default\u compression。您可以使用ZipOutputStream.setLevel()更改它


我相信您是使用jar实用程序或其他zip创建者创建了原始jar文件。然后,您使用代码创建了相同的jar文件,得到了不同的大小。在这种情况下,压缩级别可能会解释差异。

当您压缩/解压文本文件并将其与原始文件进行比较时,缺少哪些字节?在开始、结束还是随机或者文件完全不同。如果你能看到什么不同,它可以引导你找到什么错误。你从来没有得到这个问题的好答案——你解决了吗?我猜如果整个文件损坏,它与ascii/unicode处理或类似的东西有关。问题的重要摘录:“它不能在实际应用中打开”。不同的压缩级别不能解释这一点。我看不出它是压缩级别,因为差异只有几个字节,但在十六进制编辑器中查看文件,它完全不同,哦,天哪,我太迷路了!