java压缩文件为zip

使用java.util.zip相关类,将给定文件或文件夹压缩到指定zip

  1. 使用ZipOutputStream对象构建zip包存放位置,将要添加的文件构建为ZipEntry对象,
  2. 调用ZipOutputStream.putNextEntry(ZipEntry zipEntry)用来标记压缩包中一个文件的开始,
  3. 调用ZipOutput.write(byte[] b, int off, int len)将文件写入到压缩包的流之中(该方法会阻塞,直到将此文件全部写入,byte[]可以直接获取也可以使用缓冲流。写入时会自动压缩)。
  4. 注意ZipOutputStream添加完文件后必须使用ZipOutputStream.closeEntry()ZipOutputStream.close()关闭流。

示例代码如下

package com.zip;

import java.io.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

/**
 * @author zy
 * @version V1.0
 * @date 2022/8/11 11:14
 */
public class ZipTest {
    public static void main(String[] args) throws IOException {
        test01();
    }

    static void test01() throws IOException {
        String compresspath = "D:\\暂存文件";
        ZipOutputStream zipOutputStream = new ZipOutputStream(new FileOutputStream(compresspath+".zip"));
        File file = new File(compresspath);
        compressZip(zipOutputStream, file, "");
        //必须关闭,否则压缩后的zip包有问题,不能解压
        zipOutputStream.closeEntry();
        zipOutputStream.close();
    }

    private static void compressZip(ZipOutputStream zipOutput, File file, String suffixpath) {
        File[] listFiles = file.listFiles();// 列出所有的文件
        for(File fi : listFiles){
            if(fi.isDirectory()){
                if(suffixpath.equals("")){
                    compressZip(zipOutput, fi, fi.getName());
                }else{
                    compressZip(zipOutput, fi, suffixpath + File.separator + fi.getName());
                }
            }else{
                zip(zipOutput, fi, suffixpath);
            }
        }
    }

    public static void zip(ZipOutputStream zipOutput, File file, String suffixpath) {
        try {
            ZipEntry zEntry = null;
            if(suffixpath.equals("")){
                zEntry = new ZipEntry(file.getName());
            }else{
                zEntry = new ZipEntry(suffixpath + File.separator + file.getName());
            }
            //核心代码
            zipOutput.putNextEntry(zEntry);
            //将给定文件写入到压缩包中
            BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
            byte[] buffer = new byte[1024];
            int read = 0;
            while((read = bis.read(buffer)) != -1){
                //会自动压缩流数据
                zipOutput.write(buffer, 0, read);
            }
            bis.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

欢迎留言讨论

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容