本程序依賴第三方包Ant.jar。因爲java自帶的java.utils.zip.ZipOutputStream對一些敏感中文路徑會拋出異常。
package javax.zip;
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 java.util.Enumeration;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;
import org.apache.tools.zip.ZipOutputStream;
/**
* @author hubiao
* zip文件:壓縮、解壓
* [支持中文路徑]
* 用到工具類jar:org.apache.tools.zip.*
*/
@SuppressWarnings("unchecked")
public class ZIPUtils{
public static void main(String[] args) throws Exception {
/*壓縮*/
Compression(new File("F:\\aaaa"),null);
/*解壓*/
// Decompression(null,"F://aaaa.zip");
//ZipOutputStream zos = new ZipOutputStream(os,Charset.forName("GBK"));//解決中文路徑
}
/**
* 遞歸打包成zip
* @param outPut zip輸出流
* @param listFiles 目錄子文件
* @param fuPath 父級目錄名稱
* @throws Exception
*/
private static void createZip(org.apache.tools.zip.ZipOutputStream outPut,File[] listFiles,String fuPath) throws Exception {
for(File f : listFiles)
{
String name = fuPath==null?f.getName():fuPath+"/"+f.getName();;
if(f.isDirectory())
{
System.out.println("創建目錄["+name+"]");
outPut.putNextEntry(new ZipEntry(name+"/"));//這個/一定要加,不然無法創建文件夾咯!
createZip(outPut,f.listFiles(),name);
}else{
System.out.println("創建文件["+name+"]");
outPut.putNextEntry(new ZipEntry(name));
InputStream is = new FileInputStream(f);
byte[] bys = new byte[1024];
int len = 0;
while((len = is.read(bys))!=-1)
outPut.write(bys, 0, len);
is.close();
outPut.flush();
}
}
}
/**
* 解壓文件
* @param savePath 解壓保存路徑
* @param targetFile zip源文件路徑
* @throws IOException 解壓錯誤
*/
private static void Decompression(String savePath, String target) throws IOException {
long start = System.currentTimeMillis();
//設置根路徑或默認路徑(解決路徑含有 xx\xxx | aa/aaa )
File targetFile = new File(target);
//默認保存路徑
if(savePath==null)
savePath = targetFile.toString().substring(0, targetFile.toString().lastIndexOf("."));
else
savePath = savePath.concat(targetFile.toString().substring(targetFile.toString().lastIndexOf("\\"), targetFile.toString().lastIndexOf(".")));
//遍歷所有zip文件
ZipFile zipFile = new ZipFile(targetFile);
Enumeration<ZipEntry> entries = zipFile.getEntries();
OutputStream os = null;
while(entries.hasMoreElements())
{
ZipEntry ze = entries.nextElement();
String name = ze.getName();
InputStream is = zipFile.getInputStream(ze);
//創建文件夾
int last = name.lastIndexOf("/");
File destFile = null;
if(last!=-1){
destFile = new File(savePath,name.substring(0,last));
destFile.mkdirs();
if(name.indexOf(".")==-1)
continue;
destFile = new File(destFile,name.substring(last));//文件夾+文件名稱
}else{
destFile = new File(savePath,name);//文件名稱
}
System.out.println("正在解壓["+name+"]");
//讀取zip
byte[] bys = new byte[1024];
int len = 0;
os = new FileOutputStream(destFile);
while((len = is.read(bys))!=-1)
{
os.write(bys,0,len);
os.flush();
}
os.close();
}
long end = System.currentTimeMillis();
System.out.println("****************解壓完畢,消耗["+(end-start)+"(ms)];****************");
}
/**
* @param destDir 被壓縮的目錄
* @param target 壓縮保存目錄
* @throws Exception
*/
public static void Compression(File destDir, String saveDir) throws Exception {
long start = System.currentTimeMillis();
if(destDir==null || !destDir.exists())
throw new RuntimeException(destDir.toString()+" 不存在!");
if(saveDir==null)
saveDir = destDir.toString()+".zip";
ZipOutputStream outPut = new ZipOutputStream(new FileOutputStream(new File(saveDir)));
outPut.setEncoding("GBK");//設置編碼
createZip(outPut,destDir.listFiles(),null);
outPut.flush();
outPut.close();
long end = System.currentTimeMillis();
System.out.println("****************壓縮完畢,消耗["+(end-start)+"(ms)];****************");
}
}
如:壓縮運行結果:
創建目錄[2013]
創建目錄[2013/20130508]
創建文件[2013/20130508/20130508001.jpg]
創建文件[2013/20130508/20130508002.jpg]
創建文件[2013/20130508/20130508003.jpg]
創建文件[2013/20130508/20130508004.jpg]
創建文件[2013/20130508/2013050801.xml]
創建文件[2013/20130508/2013050802 - 副本.xml]
創建文件[2013/20130508/2013050802.xml]
創建文件[2013/20130508/2013050803 - 副本.xml]
創建文件[2013/20130508/2013050803.xml]
創建文件[2013/20130508/2013050804.xml]
創建目錄[2013/20130508/images]
創建文件[2013/20130508/images/20130508011.jpg]
創建文件[2013/20130508/images/20130508021.jpg]
創建文件[2013/20130508/images/20130508041.jpg]
創建文件[2013/20130508/images/201305080410.jpg]
創建文件[2013/20130508/images/201305080411.jpg]
創建文件[2013/20130508/images/201305080412.jpg]
創建文件[2013/20130508/images/201305080413.jpg]
創建文件[2013/20130508/images/20130508042.jpg]
創建文件[2013/20130508/images/20130508043.jpg]
創建文件[2013/20130508/images/20130508044.jpg]
創建文件[2013/20130508/images/20130508045.jpg]
創建文件[2013/20130508/images/20130508046.jpg]
創建文件[2013/20130508/images/20130508047.jpg]
創建文件[2013/20130508/images/20130508048.jpg]
創建文件[2013/20130508/images/20130508049.jpg]
創建目錄[2013/s]
創建文件[2013/s/2013050802.xml]
創建文件[2013/s/2013050803.xml]
創建文件[null/2013050801.xml]
創建文件[null/2013050802 - 副本.xml]
創建目錄[車]
創建目錄[車/要在]
創建目錄[順要要]
創建目錄[順要要/新建文件夾]
創建目錄[順要要/新建文件夾/sfds]
創建目錄[順要要/新建文件夾/sfds/aadf]
創建目錄[順要要/新建文件夾/新建文件夾 - 副本]
創建目錄[順要要/新建文件夾 - 副本]
****************壓縮完畢,消耗[188(ms)];****************