При создании zip-архива, что представляет собой повторяющуюся запись - PullRequest
2 голосов
/ 25 июня 2010

В веб-приложении на Java я создаю zip-файл из различных файлов в памяти (сохраняется как байт []).

Вот ключевой бит кода:

    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    ZipOutputStream zos = new ZipOutputStream(baos);
    for (//each member of a collection of objects) {

        PDFDocument pdfDocument = //generate PDF for this member of the collection;
        ZipEntry entry = new ZipEntry(pdfDocument.getFileName());
        entry.setSize(pdfDocument.getBody().length);
        zos.putNextEntry(entry);
        zos.write(pdfDocument.getBody());//pdfDocument.getBody() returns byte[]
        zos.closeEntry();
    }
    zos.close();

Проблема: иногда я получаю «ZipException: повторяющаяся запись» при выполнении строки «putNextEntry ()».

Сами PDF-файлы, безусловно, будут разными, но могут иметь одинаковое имя («PDF_File_for_John_Smith.pdf»). Достаточно ли совпадения имен, чтобы вызвать это исключение?

Ответы [ 3 ]

2 голосов
/ 25 июня 2010

Вы не можете хранить 2 записи с одинаковыми именами в zip-архиве (в одной и той же папке), так же как вы не можете иметь 2 файла с одинаковыми именами в одной папке в файловой системе.

Edit;И хотя технически формат файла zip допускает это, Java API для работы с ZIP-архивами не позволяет.

0 голосов
/ 25 июня 2010

Я верю в это. Zip изначально предназначался для архивирования структуры каталогов, поэтому он ожидает, что имена файлов будут уникальными. Вы можете добавить каталоги, чтобы ваши файлы были разделены (и предоставить дополнительную информацию для их дифференциации, если хотите).

0 голосов
/ 25 июня 2010

Да - вы можете использовать структуру каталогов внутри вашего ZIP-файла, если вам нужно хранить несколько файлов с одним и тем же именем.

...