创建 zip 存档时,啥构成重复条目

Posted

技术标签:

【中文标题】创建 zip 存档时,啥构成重复条目【英文标题】:When creating a zip archive, what constitutes a duplicate entry创建 zip 存档时,什么构成重复条目 【发布时间】:2010-06-24 20:16:13 【问题描述】:

在 Java Web 应用程序中,我从各种内存文件(存储为 byte[])创建一个 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();

问题:在执行“putNextEntry()”行时,我有时会收到“ZipException:重复条目”。

PDF 文件本身肯定会有所不同,但它们可能具有相同的名称(“PDF_File_for_John_Smith.pdf”)。名称冲突是否足以导致此异常?

【问题讨论】:

谢谢大家。我添加了代码以在生成文件名时将它们放入哈希中,如果名称已被使用,则附加一个数字。 感谢您的提问;它帮助我弄清楚在 java 中编写 zip 文件时应该如何避免重复;) 【参考方案1】:

您不能将 2 个同名的条目存储在一个 zip 存档中(在同一个文件夹中),就像您不能在一个文件系统的同一个文件夹中拥有 2 个同名的文件一样。

编辑;虽然技术上 zip 文件格式允许这样做,但用于处理 ZIP 存档的 Java API 却不允许。

【讨论】:

请注意,这实际上与 ZIP 文件格式的规范相矛盾,但是该规范完全是愚蠢的,不应该遵循 :) -1,您可以在同一文件夹中的 ZIP 存档中存储 2 个同名条目。 @dstibbe 未使用 Java zip 包。 可以将 2 个具有相同名称的条目存储在一个 zip 存档中(在同一文件夹中)。但这是错误的。【参考方案2】:

是的——如果您需要保存多个具有相同文件名的文件,您可以在 ZIP 文件中使用目录结构。

【讨论】:

【参考方案3】:

我相信是的。 Zip 最初旨在归档目录结构,因此它希望文件名是唯一的。您可以添加目录来分隔文件(如果需要,还可以提供额外信息来区分它们)。

【讨论】:

以上是关于创建 zip 存档时,啥构成重复条目的主要内容,如果未能解决你的问题,请参考以下文章

Ejabberd 存档表 (mod_archive) 中的重复条目

使用 Minizip API 从 Zip 存档中删除 Zip 条目

ZipArchive创建无效的ZIP条目

重复的 Zip 条目 MultiDex.class

Gradle 构建失败:java.util.zip.ZipException:重复条目:org/apache/commons/io/CopyUtils.class

Gradle Plugin v0.13.1 后重复的 Zip 条目