java.util.zip: putNextEntry

Я пытаюсь изменить файл в 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.

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

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

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


person Atmocreations    schedule 07.04.2010    source источник
comment
Трассировка стека исключений не согласуется с тем, откуда вы утверждаете, что она выброшена.   -  person Tom Hawtin - tackline    schedule 08.04.2010
comment
@pajton: ZipOutputStream, поправил в тексте.   -  person Atmocreations    schedule 08.04.2010
comment
@Tom Hawtin: Я понимаю, что вы имеете в виду, и это странно ... извините, я ввел неправильную трассировку стека. Сообщение на самом деле то же самое, и проблема тоже. Я поправил в тексте. Я вызываю this.zos.flush () и .close () в конце, и я просто скопировал последнюю трассировку стека исключений ... Вот как возникла ошибка, извините.   -  person Atmocreations    schedule 08.04.2010


Ответы (1)


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

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

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

person objects    schedule 07.04.2010
comment
на самом деле это означало бы, что ZipEntry содержит только информацию о файле, но не само содержимое файла (для чего предназначен входной поток, и это может быть причиной того, что getInputStream () находится в ZipFile, а не в ZipEntry ... Черт возьми, я мог сам это увидеть. Попробую еще раз и проверю еще раз ... Спасибо !! - person Atmocreations; 08.04.2010