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



我尝试将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仅在调用关闭时才写入中央目录,因为在此之前,它不知道您是否要添加新条目。

,但是由于byteArrayOutputStream.toByteArray()在您调用时返回字节数组的副本。它不包含中央目录的结束,该指导在以后写在流中。

相关内容

最新更新