gpt4 book ai didi

java - 将压缩目录输出到 ByteArrayOutputStream

转载 作者:行者123 更新时间:2023-12-01 18:22:26 25 4
gpt4 key购买 nike

我有一个用这种方法压缩的目录:

 public byte[] archiveDir(File dir)  {
try(ByteArrayOutputStream bos = new ByteArrayOutputStream(); ZipOutputStream zout = new ZipOutputStream(bos)) {
zipSubDirectory("", dir, zout);
return bos.toByteArray();
} catch (IOException e) {
throw new RuntimeException(e);
}
}

private void zipSubDirectory(String basePath, File dir, ZipOutputStream zout) throws IOException {
byte[] buffer = new byte[4096];
File[] files = dir.listFiles();
for (File file : files) {
if (file.isDirectory()) {
String path = basePath + file.getName() + "/";
zout.putNextEntry(new ZipEntry(path));
zipSubDirectory(path, file, zout);
zout.closeEntry();
} else {
FileInputStream fin = new FileInputStream(file);
zout.putNextEntry(new ZipEntry(basePath + file.getName()));
int length;
while ((length = fin.read(buffer)) > 0) {
zout.write(buffer, 0, length);
}
zout.closeEntry();
fin.close();
}
}
}

然后我将字节写入 servlet 的输出流。但是当我收到 zip 文件时,无法打开“文件格式错误”。如果我将压缩内容输出到 FileOutputStream,然后将文件内容发送到 servlet 的输出流,则它可以正常工作。好吧,这可以解决我的问题,但在这种情况下,我总是必须在临时 zip 文件的内容发送到 servlet 的输出流后删除它。是否可以仅在内存中执行此操作。

最佳答案

嗯,

        zipSubDirectory(path, file, zout);
zout.closeEntry();

应该是:

        zout.closeEntry();
zipSubDirectory(path, file, zout);

主要错误似乎是在调用 toByteArray 之前,zout 未关闭/刷新。这里的 try-with-resources 有点狡猾。

try (ByteArrayOutputStream bos = new ByteArrayOutputStream()) {
try ((ZipOutputStream zout = new ZipOutputStream(bos)) {
zipSubDirectory("", dir, zout);
}
return bos.toByteArray();
} catch (IOException e) {
throw new RuntimeException(e);
}

关于java - 将压缩目录输出到 ByteArrayOutputStream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27314976/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com