使用commons-compress操作zip文件(壓縮和解壓縮)


  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.BufferedInputStream;
import java.io.BufferedOutputStream;
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 BufferedInputStream(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 BufferedOutputStream(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);
	}
}

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM