package org.fanhongtao.zip; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; /** * 使用 JDK 自带的java.util.zip包对文件或者目录进行压缩 * @author Dharma * @created 2010-5-14 */ public class Zip { public static void main(String argv[]) { if (2 != argv.length) { System.err.println("Usage: Zip SrcFolder ZipFileName"); return; } new Zip().zipFile(argv[0], argv[1]); } /** * 对一个文件或目录(含其子目录)压缩 * @param srcPath 待压缩的文件或目录名 * @param zipFileName 生成压缩文件名 */ public void zipFile(String srcPath, String zipFileName) { try { ZipOutputStream zos = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(zipFileName))); RecursiveZip(new File(srcPath), "", zos); zos.close(); } catch (Exception e) { e.printStackTrace(); } } /** * 递归实现压缩目录及其子目录 * @param fDir 要压缩的目录或者文件 * @param pName 父压缩记录名称,第一次调用应该被设置为一个空字符串"" * @param zos 压缩输出流 * @throws FileNotFoundException * @throws IOException */ private void RecursiveZip(File fDir, String pName, ZipOutputStream zos) throws FileNotFoundException, IOException { if (fDir.isDirectory()) { // 如果为目录,ZipEntry名称的尾部应该以反斜杠"/"结尾 zos.putNextEntry(new ZipEntry(pName + fDir.getName() + "/")); File[] files = fDir.listFiles(); if (files != null) { for (int i = 0; i < files.length; i++) { // 进行递归,同时传递父文件ZipEntry的名称,还有压缩输出流 RecursiveZip(files[i], pName + fDir.getName() + "/", zos); } } } if (fDir.isFile()) { byte[] bt = new byte[2048]; ZipEntry ze = new ZipEntry(pName + fDir.getName()); // 设置压缩前的文件大小 ze.setSize(fDir.length()); zos.putNextEntry(ze); FileInputStream fis = new FileInputStream(fDir); int i = 0; while ((i = fis.read(bt)) != -1) { zos.write(bt, 0, i); } fis.close(); } } }