将zip文件创建为字节数组

时间:2014-04-29 15:57:03

标签: java spring zip zipoutputstream

我正在尝试从文件路径列表中创建一个zip文件。我想将zip文件作为字节数组,以便我可以将它作为ResponseEntity对象返回到网页。问题是,当我尝试 FileOutputStream 时,它的工作原理。我试过 ByteArrayOutputStream ,zip文件已损坏。下面是代码

//FileOutputStream bos = new FileOutputStream("C:\\files\\zipfile.zip");  
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ZipOutputStream zos = new ZipOutputStream(bos);
ArrayList<String> filepaths = getAllFiles();
byte[] contents = null;

for(String path : filepaths) {
    File pdf = new File(path);

    FileInputStream fis = new FileInputStream(pdf);

    ZipEntry zipEntry = new ZipEntry(path.substring(path.lastIndexOf(File.separator)+1));
    zos.putNextEntry(zipEntry);

    byte[] buffer = new byte[1024];
    int len;
    while ((len = fis.read(buffer)) > 0) {
        zos.write(buffer,0,len);
    }

    fis.close();
    zos.closeEntry();
    zos.flush();

}
contents = new byte[bos.size()];
contents = bos.toByteArray();

zos.close();
bos.close();

对于上面看到的第2行,如果我使用 ByteArrayOutputStream ,则zip文件似乎已损坏。但如果我使用 FileOutputstream 我无法打开zip文件并且它是内容。

这是我如何将zip字节数组发送回网页。所有这些代码都发生在弹簧控制器方法

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.parseMediaType("application/zip"));
headers.setContentDispositionFormData(zipfileNm, zipfileNm);

ResponseEntity<byte[]> response = new ResponseEntity<byte[]>(contents, headers, HttpStatus.OK);
return response;

1 个答案:

答案 0 :(得分:0)

查看Google的GUAVA库。它允许轻松复制Input to Output Streams。同时使用Apache Commons Compress检查special ZIP support

然而,你可能会让你的生活更轻松......
HTTPResponse有一个OutputStream对象。您应该获取OutputStream并将其作为参数传递给ZIP创建函数,而不是通过函数对字节数组进行混洗。这样就可以避免为字节混洗及其带来的潜在问题需要所有内存。

希望有所帮助!