两种方式实现压缩文件或文件夹
今天做峰会活动候选人报名功能时,涉及一个打包下载附件的功能。
在这里记录一下压缩文件的实现过程,压缩文件有多种实现方式。
这里记录通过java本身自带的ZipOutputStream类、或者Ant.jar下面的Zip类实现
1. Java本身自带的类ZipOutputStream实现方式
public class ZipCompressor { static final int BUFFER = 8192; private File zipFile; /** * 创建一个压缩实例 * * @param pathName 压缩到的地址 */ public ZipCompressor(String pathName) { zipFile = new File(pathName); } /** * @Description: 执行压缩 * @param srcPathName 被压缩文件 */ public void compress(String srcPathName) { File file = new File(srcPathName); if (!file.exists()) { throw new RuntimeException(srcPathName + "不存在!"); } try { // 创建文件输出流 FileOutputStream fileOutputStream = new FileOutputStream(zipFile); CheckedOutputStream cos = new CheckedOutputStream(fileOutputStream, new CRC32()); ZipOutputStream out = new ZipOutputStream(cos); String basedir = ""; compress(file, out, basedir); out.close(); } catch (Exception e) { throw new RuntimeException(e); } } /** * @Description: 判断路径是目录还是文件 * @param file 被压缩文件 * @param out 容器 * @param basedir 路径 */ private void compress(File file, ZipOutputStream out, String basedir) { /* 判断是目录还是文件 */ if (file.isDirectory()) { System.out.println("压缩:" + basedir + file.getName()); this.compressDirectory(file, out, basedir); } else { System.out.println("压缩:" + basedir + file.getName()); this.compressFile(file, out, basedir); } } /** * @Description: 压缩一个目录 * @param dir * @param out * @param basedir */ private void compressDirectory(File dir, ZipOutputStream out, String basedir) { if (!dir.exists()) { return; } // 获取目录下的所有文件 File[] files = dir.listFiles(); for (int i = 0; i < files.length; i++) { /* 递归 */ compress(files[i], out, basedir + dir.getName() + "/"); } } /** * @Description: 压缩一个文件 * @param file * @param out * @param basedir */ private void compressFile(File file, ZipOutputStream out, String basedir) { if (!file.exists()) { return; } try { // 将被压缩文件转化为缓冲输入流 BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file)); // 创建压缩包 ZipEntry entry = new ZipEntry(basedir + file.getName()); out.putNextEntry(entry);// 压缩文件名称 int count; byte data[] = new byte[BUFFER]; while ((count = bis.read(data, 0, BUFFER)) != -1) { out.write(data, 0, count); } bis.close(); } catch (Exception e) { throw new RuntimeException(e); } } public static void main(String[] args) { ZipCompressor zipCompressor = new ZipCompressor("F:\\yswj.zip"); zipCompressor.compress("F:\\Java\\资源及插件"); } }
2. 使用ant.jar下面的Zip类实现,该方式更简单一些
public class ZipCompressorByAnt { private File zipFile; public ZipCompressorByAnt(String pathName) { zipFile = new File(pathName); } /** * @param srcPathName 压缩目标 */ public void compress(String srcPathName) { File srcdir = new File(srcPathName); if (!srcdir.exists()) { throw new RuntimeException(srcPathName + "不存在!"); } Project prj = new Project(); Zip zip = new Zip(); zip.setProject(prj); zip.setDestFile(zipFile); FileSet fileSet = new FileSet(); fileSet.setProject(prj); fileSet.setDir(srcdir); //fileSet.setIncludes("**/*.java"); 包括哪些文件或文件夹 eg:zip.setIncludes("*.java"); //fileSet.setExcludes(...); 排除哪些文件或文件夹 zip.addFileset(fileSet); zip.execute(); } public static void main(String[] args) { } }
ZipOutputStream实现方法代码中有测试方法