Проблема с логикой, давайте пройдемся по ней:
- При первом обнаружении папки META-INF вы устанавливаете флаг в значение true.Ничего другого в цикле не может произойти, поэтому мы продолжаем
- На следующей итерации цикла вы сбрасываете флаг на false и переходите в раздел
!isMetaInf
Запись zipдобавлено к временному почтовому индексу:
tmpZip.putNextEntry(ze);
Вы пишете весь почтовый индекс Minecraft , от начала до конца, во временный почтовый индекс:
for(int read = minecraftZip.read(buffer); read != -1; read = minecraftZip.read(buffer))
{
tmpZip.write(buffer, 0, read);
}
tmpZip.closeEntry();
На этом этапе вы не выходите из цикла, поэтому этот процесс повторяется для каждого файла в банке.
Если вы просто удалите ручной цикл чтения и записи, вы можете позволить 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();
}