Java - размер динамического буфера потока вывода Zip - PullRequest
2 голосов
/ 10 января 2012

Я работаю над приложением, которое берет файлы из одного zip-файла и помещает их в другой, это нормально с файлами, но если в исходном zip-файле есть каталог, произойдет сбой со следующим исключением:

Exception in thread "main" java.util.zip.ZipException: invalid entry size (expected 1374 but got 1024 bytes)

Я использую следующий код:

public static void ZipExtractToZip(File inZip, File outZip) throws IOException
{
    ZipInputStream zis = new ZipInputStream(new FileInputStream(inZip));
    ZipOutputStream zos = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(outZip)));
    byte[] buffer = new byte[1024];

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

    zos.close();
    zis.close();
}

Я пробовал разные размеры буфера, но это не помогает, мне нужен способ получить динамический размер буфера.Примеры и ссылки приветствуются.

РЕДАКТИРОВАТЬ: Я изменил код, чтобы его можно было использовать

1 Ответ

2 голосов
/ 10 января 2012

Ход

zos.closeEntry();

вне самого внутреннего цикла, в противном случае вы предполагаете, что каждая запись имеет длину не более 1024 байт.

Полагаю, ваш каталог - первая запись такого размера.


Кстати, вы также можете двигаться

byte[] buffer = new byte[1024];

до внешнего цикла, поэтому он создается только один раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...