java.util.zip: putNextEntry - PullRequest
       11

java.util.zip: putNextEntry

3 голосов
/ 08 апреля 2010

Я пытаюсь изменить файл в zip-файле, используя java.util.net. Поскольку прямое изменение файла невозможно, и я хочу изменить только один файл, я просто создаю новый zip-файл, содержащий в основномсодержимое шаблона и заменить конкретный файл, по крайней мере, это план.

Вот наиболее важные строки моей попытки:

Enumeration<? extends ZipEntry> entries = zif.entries();
while (entries.hasMoreElements()) {
ZipEntry currentEntry = entries.nextElement();
if (!currentEntry.isDirectory() && currentEntry.getSize() >0 && currentEntry.getCompressedSize() > 0)
{
    System.out.println(currentEntry.getName() + ": " + currentEntry.getSize() + "-" + currentEntry.getMethod());
    if (currentEntry.getName() != "file_i_want_to_change")
    {
        try {
            this.zos.putNextEntry(currentEntry);  // HERE the exception is thrown
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println(e.getMessage());
        }
    }
}

Информация: zif = ZipFile, правильно создани открывается из существующего файла;zos = ZipOutputStream, правильно создан для нового файла.

Это исключение, которое выдается:

java.util.zip.ZipException: invalid entry size (expected 39 but got 0 bytes)
at java.util.zip.ZipOutputStream.closeEntry(ZipOutputStream.java:228)
at java.util.zip.ZipOutputStream.putNextEntry(ZipOutputStream.java:144)
at TestClass.replace(TestClass.java:117)
at TestClass.main(TestClass.java:10)

, тогда как TestClass: 117 - это строка с комментарием, в которой он завершается ошибкой

Самое смешное, что System.out.println в этом фрагменте кода работает отлично и без каких-либо отчетов о файлах размером 0.

Кто-нибудь видит ошибку, которая у меня может быть?сделано?

Любая идея приветствуется.

Заранее спасибо и наилучшими пожеланиями

1 Ответ

7 голосов
/ 08 апреля 2010

Недостаточно просто записать ZipEntry в поток, вам все равно нужно записать содержимое.

        this.zos.putNextEntry(new ZipEntry(currentEntry));
        int len;
        while ((len = zis.read(buf)) >= 0)
        {
           zos.write(buf, 0, len);
        }

Полный пример здесь

...