commons-compress操作zip文件(壓縮和解壓縮)
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.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);
}
}</pre>