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。
我尝试将 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。