Java:Zipinputstream 到 Zipoutputstream 导致 "end-of-central-directory signature not found" 错误

Java: Zipinputstream to Zipoutputstream leads to "end-of-central-directory signature not found" Error

我尝试将 Zip 从 Zipinputstream 复制到 Zipoutputstream

我将 Zip 作为 byte[] 存储在 Oracle 数据库中。我使用 Zipinputstream 解压缩 zip(稍后我想编辑 Zip)然后将其放入 Zipoutputstream 以获得新的 byte[] 并使用此数组稍后通过一个ServletOutputStream。当我创建一个新文件时 - 没有 Zipinputstream - 它可以工作。但是当我使用 Zipinputstream 时,我得到了错误。

这是我的代码:

        ZipInputStream zipInputStream = new ZipInputStream(new ByteArrayInputStream(fileFromDataBase),
                Charset.forName("UTF-8"));
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        ZipOutputStream zos = new ZipOutputStream(byteArrayOutputStream, Charset.forName("UTF-8"));
        ZipEntry currentEntry;
        byte[] buffer = new byte[8192];
        while ((currentEntry = zipInputStream.getNextEntry()) != null) {
            ZipEntry newEntry = new ZipEntry(currentEntry.getName());
            zos.putNextEntry(newEntry);
            int length;
            while ((length = zipInputStream.read(buffer)) > 0) {
                zos.write(buffer, 0, length);
            }
            zos.closeEntry();                   
        }

        //TO Object to download later the Zipfile from html page
        paketDownloadTO = new PaketDownloadTO();
        paketDownloadTO.setData(byteArrayOutputStream.toByteArray());
        paketDownloadTO.setFileName(fileName);

        zos.finish();
        zipInputStream.close();
        zos.close();

我的猜测是您应该在 byteArrayOutputStream.close() 之前执行 zos.close()

更新:

并移动:

paketDownloadTO = new PaketDownloadTO();
paketDownloadTO.setData(byteArrayOutputStream.toByteArray());
paketDownloadTO.setFileName(fileName);

zos.close();

之后

问题是,在调用 zipInputStream.close()

之前先调用 byteArrayOutputStream.toByteArray()

ZipInputStream 仅在调用关闭时写入 end-of-central-directory,因为在此之前它不知道您是否要添加新条目。

但是因为 byteArrayOutputStream.toByteArray() returns 在您调用它时字节数组的副本。它不包含稍后写入流的 end-of-central-directory。