使用 ZipOutPutStream Java 压缩(zip)文件列表

Posted

技术标签:

【中文标题】使用 ZipOutPutStream Java 压缩(zip)文件列表【英文标题】:Compressing(zip) List of files with ZipOutPutStream Java 【发布时间】:2017-08-16 07:54:33 【问题描述】:

我正在尝试压缩在字符串上转换的 Xml 列表,将它们仅保存在一个 zip 文件中,并在 restful 上作为 POST 的正文返回。但是每次我保存文件时都会收到错误消息“存档格式未知或已损坏”。

protected ByteArrayOutputStream zip(Map<String, String> mapConvertedXml) 
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    ZipOutputStream zos = new ZipOutputStream(baos);
    try 
        for(Map.Entry<String, String> current : mapConvertedXml.entrySet())

            ZipEntry entry = new ZipEntry(current.getKey() + ".xml");
            entry.setSize(current.getValue().length());
            zos.putNextEntry(entry);
            zos.write(current.getValue().getBytes());
            zos.flush();
        

        zos.close();

     catch (IOException ioe) 
        ioe.printStackTrace();
    
    return baos;

谁能帮我解决这个问题?

【问题讨论】:

您是否尝试在传输到网络之前检查 zip 文件? 您使用的字符集是什么?因为字符串的长度并不总是与其字节数组的长度匹配。 @nandsito 不,我没有,ZipOutputStream 上有没有这个功能? @Boschi 我正在处理字符集 UTF-8 上的 xml 列表作为字符串(这是列表 Map mapConvertedXml)。 在方法结束时baos 将是一个内存中的 zip 文件。尝试将其转储到某个文件中 【参考方案1】:

要测试您的 zip 文件,请将其临时保存在文件系统中并手动打开。

FileOutputStream fos = new FileOutputStream(pathToZipFile);
ZipOutputStream zos = new ZipOutputStream(fos);

然后,您可以使用类似的东西来构建您的 Rest Server 并返回您的文件。

public static Response getFileLast(@Context UriInfo ui, @Context HttpHeaders hh) 
    Response response = null;
    byte[] sucess = null;
    ByteArrayOutputStream baos = getYourFile();
    sucess = baos.toByteArray();
    if(sucess!=null) 
        response = Response.ok(sucess, MediaType.APPLICATION_OCTET_STREAM).header("content-disposition","attachment; filename = YourFileName").build();
     else 
        response = Response.status(Status.NOT_FOUND).type(MediaType.APPLICATION_JSON).entity(new Error("Error downloading file.")).build();
    

    return response;

例如,您可以测试这个Advanced Rest Client。

【讨论】:

以上是关于使用 ZipOutPutStream Java 压缩(zip)文件列表的主要内容,如果未能解决你的问题,请参考以下文章

ZipOutputStream 类的 closeEntry()

Java ??????ZipOutputStream ??????????????????

在 ZipOutputStream.write() 方法中强化隐私违规

java压缩文件中文名乱码问题

使用 ZipOutputStream 和 FileStream 压缩文件时出现异常

防止从 ZipOutPutStream 中删除重复项