我尝试将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()
在您调用时返回字节数组的副本。它不包含中央目录的结束,该指导在以后写在流中。