2012-01-16 47 views
1

我目前正在研究一个将mods安装到Minecraft中的应用程序,并且我已经差不多完成了3.1DEV版,唯一阻止我的是我的代码刚刚赢得' t取出META-INF,这里是我的代码Java - 从jar中删除META-INF不起作用

 ZipInputStream modZip = new ZipInputStream(new FileInputStream(mod.getDir())); 
     ZipInputStream minecraftZip = new ZipInputStream(new FileInputStream(new File(mcDir + "\\bin\\", "minecraft.jar"))); 
     ZipOutputStream tmpZip = new ZipOutputStream(new FileOutputStream(new File("temp\\tmp.jar"))); 
     byte[] buffer = new byte[1024]; 

     for(ZipEntry ze = modZip.getNextEntry(); ze != null; ze = modZip.getNextEntry()) 
     { 
      tmpZip.putNextEntry(ze); 
      for(int read = modZip.read(buffer); read != -1; read = modZip.read(buffer)) 
      { 
       tmpZip.write(buffer, 0, read); 
      } 
      tmpZip.closeEntry(); 
     } 
     modZip.close(); 


     for(ZipEntry ze = minecraftZip.getNextEntry(); ze != null; ze = minecraftZip.getNextEntry()) 
     { 
      try 
      { 
       boolean isMetaInf = false; 

       if(ze.getName().contains("META-INF")) 
       { 
        isMetaInf = true; 
       } 

       if(!isMetaInf) 
       { 
        tmpZip.putNextEntry(ze); 
        for(int read = minecraftZip.read(buffer); read != -1; read = minecraftZip.read(buffer)) 
        { 
         tmpZip.write(buffer, 0, read); 
        } 
        tmpZip.closeEntry(); 
       } 
      } 
      catch(Exception e) 
      { 
       continue; 
      } 
     } 
     minecraftZip.close(); 

     tmpZip.flush(); 
     tmpZip.close(); 

     File tmp = new File("temp//tmp.jar"); 
     tmp.renameTo(new File("temp//minecraft.jar")); 
     File minecraft = new File(mcDir + "\\bin\\minecraft.jar"); 
     minecraft.delete(); 
     FileUtils.copyFile(new File("temp\\minecraft.jar"), minecraft); 
     tmp.delete(); 

任何链接或例子是欢迎

  • 利亚姆,公共的蜂软件CEO
+0

我不知道你是否看了这么许可条款,这是CC-百科,内容在这里可以使用w没有授权(AFAIK),如果您认为它不应该分发,请删除。 – kosa 2012-01-16 05:40:51

回答

0

的问题是与LOGI C,让我们走过它:

  1. 第一次找到META-INF文件夹,你的标志设置为 真。闲来无事在循环,可能会发生,所以我们继续
  2. 在下一循环迭代,你的标志重置为false,并进入 的!isMetaInf部分
  3. ZIP条目添加到临时压缩:

    tmpZip.putNextEntry(ze);

  4. 你写的整个的Minecraft拉链,从开始到结束到临时邮编:

    for(int read = minecraftZip.read(buffer); read != -1; read = minecraftZip.read(buffer)) 
    { 
        tmpZip.write(buffer, 0, read); 
    } 
    tmpZip.closeEntry(); 
    
  5. 此时您不会跳出循环,因此对于jar中的每个文件都会重复此过程。

如果你只是删除手动读写循环,可以让ZipOutputStream当您在结束通话close()做所有的写作给你,或者如果您使用的Java 7,您可以使此代码很

public static void copyWithoutMetaInf(final String originalZip, final String newZip) throws IOException 
{ 
    try (final ZipInputStream zip = new ZipInputStream(new FileInputStream(originalZip)); 
     final ZipOutputStream zop = new ZipOutputStream(new FileOutputStream(newZip))) 
    { 
     ZipEntry entry; 
     while((entry = zip.getNextEntry()) != null) 
     { 
      if(!entry.getName().contains("META-INF")) 
      { 
       zop.putNextEntry(entry); 
      } 
     } 
    } 
} 

public static void main(String[] args) throws IOException 
{ 
    copyWithoutMetaInf("1.6.4.jar", "copy.jar"); 
} 

或者没有,旧版本:一个尝试 - 与资源简单

public static void copyWithoutMetaInf(final String originalZip, final String newZip) throws IOException 
{ 
    final ZipInputStream zip = new ZipInputStream(new FileInputStream(originalZip)); 
    final ZipOutputStream zop = new ZipOutputStream(new FileOutputStream(newZip)); 
    ZipEntry entry; 
    while((entry = zip.getNextEntry()) != null) 
    { 
     if(!entry.getName().contains("META-INF")) 
     { 
      zop.putNextEntry(entry); 
     } 
    } 
    zip.close(); 
    zop.close(); 
} 
+0

这种方法实际上工作吗?看来putNextEntry只创建元数据,您仍然需要编写文件内容http://stackoverflow.com/questions/30859295/removing-a-jar-files-meta-inf-folder-in-java#comment49761303_30859295 – Thilo 2015-06-16 05:23:18