ZipOutputStream 压缩后文件解压报错

120 阅读1分钟

ZipOutputStream 压缩后文件大小不对

image.png

原始代码

final File tempFile = File.createTempFile("apply", ".zip");
try (ZipOutputStream out = new ZipOutputStream(Files.newOutputStream(Paths.get(tempFile.getPath())))) {
    final List<Apply> beanList = selectList();
    for (PjApplyBean bean : beanList) {
        if (StringUtils.isBlank(bean.getUrl())) {
            continue;
        }
        try {
            final byte[] downloadBytes = HttpUtil.downloadBytes(fileDefaultProperties.getUrl() + bean.getUrl());
            out.putNextEntry(new ZipEntry(bean.getFileName()));
            out.write(downloadBytes);
        } catch (Exception e) {
            LOGGER.info("下载失败:" + bean.getUrl(), e);
        }
    }
} finally {
    FileUtil.del(tempFile);
}

缺少 out.closeEntry()

final File tempFile = File.createTempFile("apply", ".zip");
try (ZipOutputStream out = new ZipOutputStream(Files.newOutputStream(Paths.get(tempFile.getPath())))) {
    final List<Apply> beanList = selectList();
    for (PjApplyBean bean : beanList) {
        if (StringUtils.isBlank(bean.getUrl())) {
            continue;
        }
        try {
            final byte[] downloadBytes = HttpUtil.downloadBytes(fileDefaultProperties.getUrl() + bean.getUrl());
            out.putNextEntry(new ZipEntry(bean.getFileName()));
            out.write(downloadBytes);
            out.closeEntry();
        } catch (Exception e) {
            LOGGER.info("下载失败:" + bean.getUrl(), e);
        }
    }
} finally {
    FileUtil.del(tempFile);
}

处理后文件大小正常了,但是解压报错

image.png

image.png

最后处理

final File tempFile = File.createTempFile("apply", ".zip");
try (ZipOutputStream out = new ZipOutputStream(Files.newOutputStream(Paths.get(tempFile.getPath())))) {
    final List<Apply> beanList = selectList();
    for (PjApplyBean bean : beanList) {
        if (StringUtils.isBlank(bean.getUrl())) {
            continue;
        }
        try {
            final byte[] downloadBytes = HttpUtil.downloadBytes(fileDefaultProperties.getUrl() + bean.getUrl());
            out.putNextEntry(new ZipEntry(bean.getFileName()));
            out.write(downloadBytes);
            out.closeEntry();
        } catch (Exception e) {
            LOGGER.info("下载失败:" + bean.getUrl(), e);
        }
    }
    // 完成
    out.finish();
} finally {
    FileUtil.del(tempFile);
}

缺少out.finish()