gpt4 book ai didi

Java - 从 jar 中删除 META-INF 不起作用

转载 作者:行者123 更新时间:2023-12-01 05:31:41 31 4
gpt4 key购买 nike

我目前正在开发一个将 mod 安装到 Minecraft 中的应用程序,我几乎已经完成了 3.1DEV 版本,唯一阻止我的是我的代码不会删除 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();

欢迎任何链接或示例

  • 利亚姆,Hachi Software 首席执行官

最佳答案

问题出在逻辑上,让我们来看看:

  1. 第一次找到 META-INF 文件夹时,将标志设置为真的。循环中不会发生任何其他事情,因此我们继续
  2. 在下一次循环迭代中,您将标志重置为 false 并进入!isMetaInf 部分
  3. zip 条目已添加到临时 zip 中:

    tmpZip.putNextEntry(ze);

  4. 您将整个 Minecraft zip 从头到尾写入临时 zip 中:

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

如果您只是删除手动读写循环,则可以在最后调用 close() 时允许 ZipOutputStream 为您完成所有写入操作,或者如果您使用 Java 7,则可以让 ZipOutputStream 为您完成所有写入操作。可以使用 try-with-resources 使此代码变得非常简单:

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

关于Java - 从 jar 中删除 META-INF 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8876138/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com