Apache Commons Compress是一个压缩、解压缩文件的类库。

  可以操作ar, cpio, Unix dump, tar, zip, gzip, XZ, Pack200 and bzip2格式的文件,功能比较强大。

  在这里写两个用Commons Compress把文件压缩成zip和从zip解压缩的方法。

  直接贴上工具类代码。

package cn.luxh.utils;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import org.apache.commons.compress.archivers.ArchiveEntry;import org.apache.commons.compress.archivers.zip.Zip64Mode;import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;import org.apache.commons.compress.archivers.zip.ZipArchiveInputStream;import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream;/** * Zip文件工具类 * @author Luxh */public class ZipFileUtil {		/**	 * 把文件压缩成zip格式	 * @param files			需要压缩的文件	 * @param zipFilePath 压缩后的zip文件路径	,如"D:/test/aa.zip";	 */	public static void compressFiles2Zip(File[] files,String zipFilePath) {		if(files != null && files.length >0) {			if(isEndsWithZip(zipFilePath)) {				ZipArchiveOutputStream zaos = null;				try {					File zipFile = new File(zipFilePath);					zaos = new ZipArchiveOutputStream(zipFile);					//Use Zip64 extensions for all entries where they are required					zaos.setUseZip64(Zip64Mode.AsNeeded);										//将每个文件用ZipArchiveEntry封装					//再用ZipArchiveOutputStream写到压缩文件中					for(File file : files) {						if(file != null) {							ZipArchiveEntry zipArchiveEntry  = new ZipArchiveEntry(file,file.getName());							zaos.putArchiveEntry(zipArchiveEntry);							InputStream is = null;							try {								is = new FileInputStream(file);								byte[] buffer = new byte[1024 * 5];  								int len = -1;								while((len = is.read(buffer)) != -1) {									//把缓冲区的字节写入到ZipArchiveEntry									zaos.write(buffer, 0, len);								}								//Writes all necessary data for this entry.								zaos.closeArchiveEntry();  							}catch(Exception e) {								throw new RuntimeException(e);							}finally {								if(is != null) 									is.close();							}													}					}					zaos.finish();				}catch(Exception e){					throw new RuntimeException(e);				}finally {						try {							if(zaos != null) {								zaos.close();							}						} catch (IOException e) {							throw new RuntimeException(e);						}				}							}					}			}		/**	 * 把zip文件解压到指定的文件夹	 * @param zipFilePath   zip文件路径, 如 "D:/test/aa.zip"	 * @param saveFileDir   解压后的文件存放路径, 如"D:/test/"	 */	public static void decompressZip(String zipFilePath,String saveFileDir) {		if(isEndsWithZip(zipFilePath)) {			File file = new File(zipFilePath);			if(file.exists()) {				InputStream is = null;				//can read Zip archives				ZipArchiveInputStream zais = null;				try {					is = new FileInputStream(file);					zais = new ZipArchiveInputStream(is);					ArchiveEntry  archiveEntry = null;					//把zip包中的每个文件读取出来					//然后把文件写到指定的文件夹					while((archiveEntry = zais.getNextEntry()) != null) {						//获取文件名						String entryFileName = archiveEntry.getName();						//构造解压出来的文件存放路径						String entryFilePath = saveFileDir + entryFileName;						byte[] content = new byte[(int) archiveEntry.getSize()];						zais.read(content);						OutputStream os = null;						try {							//把解压出来的文件写到指定路径							File entryFile = new File(entryFilePath);							os = new FileOutputStream(entryFile);							os.write(content);						}catch(IOException e) {							throw new IOException(e);						}finally {							if(os != null) {								os.flush();								os.close();							}						}											}				}catch(Exception e) {					throw new RuntimeException(e);				}finally {						try {							if(zais != null) {								zais.close();							}							if(is != null) {								is.close();							}						} catch (IOException e) {							throw new RuntimeException(e);						}				}			}		}	}		/**	 * 判断文件名是否以.zip为后缀	 * @param fileName        需要判断的文件名	 * @return 是zip文件返回true,否则返回false	 */	public static boolean isEndsWithZip(String fileName) {		boolean flag = false;		if(fileName != null && !"".equals(fileName.trim())) {			if(fileName.endsWith(".ZIP")||fileName.endsWith(".zip")){				flag = true;			}		}		return flag;	}	}

  再来测试一下:

package cn.luxh.test;import java.io.File;import org.junit.Test;import cn.luxh.utils.ZipFileUtil;/** * 测试ZipFileUtil的压缩和解压缩方法 * @author Luxh */public class ZipFileUtilTest {		@Test	public void testCompressFiles2Zip() {		//存放待压缩文件的目录		File srcFile = new File("D:/test");		//压缩后的zip文件路径		String zipFilePath = "d:/test2/test.zip";		if(srcFile.exists()) {			File[] files = srcFile.listFiles();			ZipFileUtil.compressFiles2Zip(files, zipFilePath);		}	}		@Test	public void testDecompressZip()  {		//压缩包所在路径		String zipFilePath = "d:/test2/test.zip";		//解压后的文件存放目录		String saveFileDir = "d:/test2/";		//调用解压方法		ZipFileUtil.decompressZip(zipFilePath, saveFileDir);	}}