使用apache旗下的commons-compress 壓縮和解壓zip檔案
可以參考我的前一篇部落格:http://hw1287789687.iteye.com/blog/1976309
以下是我封裝的一個工具類,專門負責zip的壓縮和解壓
compressziputil:
package com.common.util;
import java.io.file;
import java.io.fileinputstream;
import java.io.fileoutputstream;
import java.io.ioexception;
import java.util.arraylist;
import java.util.list;
import org.apache.commons.compress.archivers.archiveexception;
import org.apache.commons.compress.archivers.archiveinputstream;
import org.apache.commons.compress.archivers.archiveoutputstream;
import org.apache.commons.compress.archivers.archivestreamfactory;
import org.apache.commons.compress.archivers.zip.ziparchiveentry;
import org.apache.commons.compress.archivers.zip.ziparchiveinputstream;
import org.apache.commons.compress.archivers.zip.ziparchiveoutputstream;
import com.io.hw.file.util.fileutils;
import com.string.widget.util.valuewidget;
import com.swing.messagebox.guiutil23;
/***
* use apache
* commons-compress,http://www.cnblogs.com/un4sure/archive/2011/09/27/
* 2193298.html,http://hw1287789687.iteye.com/blog/1976309
*
* @author huangwei
* @since 2013-11-18
*/
public final class compressziputil {
private compressziputil() {
throw new error("don't let anyone instantiate this class.");
}
/***
*
* @param zipout
* @param filepath
* :要壓縮的單個檔案
* @throws ioexception
*/
public static void addentry(ziparchiveoutputstream zipout, string filepath)
throws ioexception {
file singlefile = new file(filepath);
if (singlefile.isdirectory()) {
return;
}
ziparchiveentry zipentry2 = new ziparchiveentry(singlefile,
systemutil.getfilesimplename(filepath));
zipout.putarchiveentry(zipentry2);
fileinputstream fin = new fileinputstream(filepath);
// 不要關閉zipout,關閉之前要執行closearchiveentry()
fileutils.writein2output(fin, zipout, false, true);
* : 要壓縮的單個檔案
public static void addentry(ziparchiveoutputstream zipout, file filepath)
if (filepath.isdirectory()) {
ziparchiveentry zipentry2 = new ziparchiveentry(filepath,
filepath.getname());
* @param filepaths
* :要壓縮的檔案
public static void compresszip(ziparchiveoutputstream zipout,
@suppresswarnings("rawtypes") list filepaths) throws ioexception {
for (object fileobj : filepaths) {
if (fileobj instanceof file) {
file file = (file) fileobj;
addentry(zipout, file);
} else {
addentry(zipout, (string) fileobj);
}
zipout.closearchiveentry();
zipout.flush();
zipout.finish();
zipout.close();
* 壓縮.
* @param zipfile
* :壓縮的結果--zip檔案
* @throws archiveexception
public static void compresszip(file zipfile,
@suppresswarnings("rawtypes") list filepaths) throws ioexception,
archiveexception {
fileoutputstream fou = new fileoutputstream(zipfile);
archiveoutputstream archouts = new archivestreamfactory()
.createarchiveoutputstream(archivestreamfactory.zip, fou);
if (archouts instanceof ziparchiveoutputstream) {
ziparchiveoutputstream zipout = (ziparchiveoutputstream) archouts;
compresszip(zipout, filepaths);
public static void compresszip(string zipfile,
compresszip(new file(zipfile), filepaths);
* compress single file.
* :single file
public static void compresssingefile(string zipfile, string filepath)
throws ioexception, archiveexception {
list filepaths = new arraylist();
filepaths.add(filepath);
compresszip(zipfile, filepaths);
public static void compresssingefile(string zipfile, file filepath)
* 壓縮指定檔案夾中的所有檔案.
* @param folderpaths
public static void compresszip(string zipfile, string folderpaths)
list list = fileutils.getlistfiles(new file(folderpaths));
compresszip(zipfile, list);
public static void compresszip(string zipfile, file folderpaths)
list list = fileutils.getlistfiles(folderpaths);
* 解壓zip
* @param decompressloc
* :解壓之後的檔案所在目錄
public static boolean decompress(string zipfile, file decompressloc)
throws archiveexception, ioexception {
fileinputstream fin = new fileinputstream(zipfile);
archiveinputstream archouts = new archivestreamfactory()
.createarchiveinputstream(archivestreamfactory.zip, fin);
ziparchiveinputstream zipin = (ziparchiveinputstream) archouts;
ziparchiveentry zipentry;
while (!valuewidget.isnullorempty(zipentry = zipin.getnextzipentry())) {
string filename = zipentry.getname();
file singfile = new file(decompressloc, filename);
if (singfile.exists()) {//若解壓後的檔案已經存在,則直接退出
guiutil23.warningdialog("file \"" + singfile.getabsolutepath()
+ "\" does exist.");
zipin.close();
// break;
return false;
system.out.println(filename);
fileutils.writein2output(zipin, new fileoutputstream(singfile),
true, false);
zipin.close();
return true;
public static boolean decompress(string zipfile, string decompresslocstr)
file decompressloc = new file(decompresslocstr);
return decompress(zipfile, decompressloc);
}
附件:
(1)依賴的jar包 io0007-find_progess(包含源碼)
(2)例子:目前隻能壓縮和解壓一級目錄的zip檔案,zip_mgmt-0.0.1-snapshot.jar