使用Java打包Zip文件

在项目中可能会遇到,下载文件的情况,下载文件还是比较好处理的

比较简单的方式就是我们直接写入OutPutstream,网上会有很所类似的教程。

也可以使用一些现成的工具类。

那么当我们遇到了需要下载文件夹的时候,我们不得不遍历所有的文件,去逐个的下载文件,这个时候我们最好是返回给前端一个zip或者tar包的形式,供用户下载使用,这里我来分享一下有关Java如何将文件夹打包并且上传。

这里我们使用的核心类就是

ZipOutputStream

代码如下

// 一般情况,我们先新建一个ZipOutputStream对象, 其中的outputStream就是我们的输出流
ZipOutputStream zip = new ZipOutputStream(outputStream);

// 假如这就是我们要下载的文件夹。
String dir = "/root/data"

// 文件的名称可以根据需要来定制化
String fileName = "data.zip";

response.setCharacterEncoding("UTF-8");
            response.addHeader("Access-Control-Allow-Origin", "*");
            response.setHeader("Access-Control-Expose-Headers", "*");
            // 下载文件名乱码问题
            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
            //response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + downloadName);
            response.setContentType("application/octet-stream;charset=UTF-8");

// 这就是最高级目录了,这也是最核心的方法,建立zip包下的层级关系,然后遇到文件写进去就行了,其他没啥特殊的
zip.putNextEntry(new ZipEntry(dir));

// 接下来,就是写一个递归方法了,类似下面的这个方法 , 伪代码如下

private void handlerFile(Item item, String base) {
    zip.putNextEntry(new ZipEntry(dir + "" + base));
    if(item.isdir()) {
        // 如果是文件夹,文件夹没有内容的,只需要继续递归,要注意的是,zip文件夹的路径拼接
           handlerFile(item, base + item.name);
    } else {
            // 写文件,这里就要正式写文件了
            inputStream = item.getinputStream;
            BufferedInputStream bis = new BufferedInputStream(inputStream);
            byte[] buffer = new byte[1024];
            int num;
            while ((num = inputStream.read(buffer)) != -1) {
                zip.write(buffer, 0, num);
            }
            zip.flush();
            IOUtils.closeQuietly(bis);

    }
    
}

你可能感兴趣的:(java,java,zip,ZipOutputStream,java打zip)