Java Zip 压缩

Java Zip 压缩

最近需要使用到 Java 对多个文件进行压缩打包,而 Java 提供的基本的 Zip 功能并不能满足我的需求,因此在此基础上,我对其进行了封装已满足我的需求。其实,我的需求也并不复杂,就是将多个文件通过 zip 打包到一个压缩文件中,由于之前没有怎么接触过 Java,因此在这里记录一下,以方便以后查询。

实现

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class Zip {

    public static void main(String[] args) {
        zip("cplusplus", "cplusplus/a.out", "cplusplus/test.cc", "cplusplus/writing/ShortPath.java");
    }

    /**
     * 压缩给定的文件到 *zipFileName* 中
     * @param zipFileName 压缩后的文件名,函数会在该文件名后添加 zip 后缀
     * @param filenames 待压缩文件名
     * @return true - 成功, false - 失败
     */
    public static boolean zip(String zipFileName, String ... filenames) {
        try {
            ZipOutputStream outputStream = new ZipOutputStream(new FileOutputStream(zipFileName + ".zip"));

            for (String name : filenames) {
                File file = new File(name);
                if (file != null) {
                    zip(outputStream, file, file.getName());            
                }       
            }

            outputStream.close();
            return true;

        } catch (Exception e) {
            e.printStackTrace();        
        }

        return false;   
    }

    /**
     * 递归压缩
     * @param out Zip 的输出流
     * @param file 待压缩的文件对象
     * @param filename 待压缩的文件名
     * @note 若 file 为目录时,该函数将递归的压缩其子目录
     */
    public static void zip(ZipOutputStream out, File file, String filename) throws IOException {
        if (file.isDirectory()) {
            File[] files = file.listFiles();
            if (files.length == 0) {
                out.putNextEntry(new ZipEntry(filename + "/"));     
            }

            for (File f : files) {
                zip(out, f, filename + "/" + f.getName());      
            }       
        } else {
            out.putNextEntry(new ZipEntry(filename));
            FileInputStream inputStream = new FileInputStream(file);
            BufferedInputStream bi = new BufferedInputStream(inputStream);
            int b;
            while ((b = bi.read()) != -1) {
                out.write(b);       
            }
            out.closeEntry();
            inputStream.close();        
        }   
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值