Java 创建zip存档时,什么构成重复条目

Java 创建zip存档时,什么构成重复条目,java,zip,duplicates,zipfile,Java,Zip,Duplicates,Zipfile,在JavaWeb应用程序中,我从各种内存文件(存储为byte[])创建一个zip文件 下面是代码的关键部分: ByteArrayOutputStream baos = new ByteArrayOutputStream(); ZipOutputStream zos = new ZipOutputStream(baos); for (//each member of a collection of objects) { PDFDocument pdfDoc

在JavaWeb应用程序中,我从各种内存文件(存储为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:duplicate entry”


PDF文件本身当然会有所不同,但它们可能有相同的名称(“PDF文件”代表约翰·史密斯,PDF)。名称冲突是否足以导致此异常

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

在ZIP存档(在同一文件夹中)中不能存储两个具有相同名称的条目,就像在文件系统的同一文件夹中不能存储两个具有相同名称的文件一样


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

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

请注意,这实际上与ZIP文件格式的规范相矛盾,但是该规范非常愚蠢,不应遵循:)-1,您可以在同一文件夹中的ZIP存档中存储两个同名条目。@dstibbe不使用Java ZIP包。您可以在ZIP存档(在同一文件夹中)中存储两个同名条目。但这是错误的。谢谢大家。我添加了代码,以便在生成文件名时将其放入哈希中,如果名称已被使用,则添加一个数字;它帮助我找到了在java中编写zip文件时应避免重复的方法;)