三种不错的方法:
1、jdk自带的包java.util.zip.ZipOutputStream,不足之处,文件(夹)名称带中文时,
出现乱码问题,实现代码如下:
/**
*功能:把sourceDir目录下的所有文件进行zip格式的压缩,保存为指定zip文件
*@param
sourceDir如果是目录,eg:D:\\MyEclipse\\first\\testFile,则压缩目录下所有文件;
*
如果是文件,eg:D:\\MyEclipse\\first\\testFile\\aa.zip,则只压缩本文件
*@param
zipFile最后压缩的文件路径和名称,eg:D:\\MyEclipse\\first\\testFile\\aa.zip
*/
publicFiledoZip(StringsourceDir,StringzipFilePath)
throws
IOException{
Filefile=newFile(sourceDir);
FilezipFile=
newFile(zipFilePath);
ZipOutputStreamzos=null;
try{
//
创建写出流操作
OutputStreamos=new
FileOutputStream(zipFile);
BufferedOutputStreambos=new
BufferedOutputStream(os);
zos=new
ZipOutputStream(bos);
StringbasePath=null;
//
获取目录
if(file.isDirectory()){
basePath=
file.getPath();
}else{
basePath=
file.getParent();
}
zipFile(file,basePath,
zos);
}finally{
if(zos!=null)
{
zos.closeEntry();
zos.close();
}
}
return
zipFile;
}
/**
*@paramsource源文件
*@parambasePath
*@paramzos
*/
privatevoidzipFile(Filesource,StringbasePath,ZipOutputStream
zos)
throwsIOException{
File[]files=null;
if
(source.isDirectory()){
files=source.listFiles();
}else
{
files=newFile[1];
files[0]=
source;
}
InputStreamis=null;
String
pathName;
byte[]buf=newbyte[1024];
intlength=
0;
try{
for(Filefile:files){
if(file.isDirectory())
{
pathName=file.getPath().substring(basePath.length()+1)+
"/";
zos.putNextEntry(newZipEntry(pathName));
zipFile(file,
basePath,zos);
}else{
pathName=
file.getPath().substring(basePath.length()+1);
is=new
FileInputStream(file);
BufferedInputStreambis=new
BufferedInputStream(is);
zos.putNextEntry(new
ZipEntry(pathName));
while((length=bis.read(buf))>0)
{
zos.write(buf,0,length);
}
}
}
}finally
{
if(is!=null){
is.close();
}
}
}
2、使用org.apache.tools.zip.ZipOutputStream,代码如下,
Java代码:
packagenet.szh.zip;
importjava.io.BufferedInputStream;
importjava.io.File;
importjava.io.FileInputStream;
importjava.io.FileOutputStream;
importjava.util.zip.CRC32;
importjava.util.zip.CheckedOutputStream;
importorg.apache.tools.zip.ZipEntry;
importorg.apache.tools.zip.ZipOutputStream;
publicclassZipCompressor{
staticfinalintBUFFER=8192;
privateFilezipFile;
publicZipCompressor(StringpathName){
zipFile=newFile(pathName);
}
publicvoidcompress(StringsrcPathName){
Filefile=newFile(srcPathName);
if(!file.exists())
thrownewRuntimeException(srcPathName+"不存在!");
try{
FileOutputStreamfileOutputStream=newFileOutputStream(zipFile);
CheckedOutputStreamcos=newCheckedOutputStream(fileOutputStream,
newCRC32());
ZipOutputStreamout=newZipOutputStream(cos);
Stringbasedir="";
compress(file,out,basedir);
out.close();
}catch(Exceptione){
thrownewRuntimeException(e);
}
}
privatevoidcompress(Filefile,ZipOutputStreamout,Stringbasedir){
/*判断是目录还是文件*/
if(file.isDirectory()){
System.out.println("压缩:"+basedir+file.getName());
pressDirectory(file,out,basedir);
}else{
System.out.println("压缩:"+basedir+file.getName());
pressFile(file,out,basedir);
}
}
/**压缩一个目录*/
privatevoidcompressDirectory(Filedir,ZipOutputStreamout,Stringbasedir){
if(!dir.exists())
return;
File[]files=dir.listFiles();
for(inti=0;i
/*递归*/
compress(files[i],out,basedir+dir.getName()+"/");
}
}
/**压缩一个文件*/
privatevoidcompressFile(Filefile,ZipOutputStreamout,Stringbasedir){
if(!file.exists()){
return;
}
try{
BufferedInputStreambis=newBufferedInputStream(
newFileInputStream(file));
ZipEntryentry=newZipEntry(basedir+file.getName());
out.putNextEntry(entry);
intcount;
bytedata[]=newbyte[BUFFER];
while((count=bis.read(data,0,BUFFER))!=-1){
out.write(data,0,count);
}
bis.close();
}catch(Exceptione){
thrownewRuntimeException(e);
}
}
}
3、可以用ant中的org.apache.tools.ant.taskdefs.Zip来实现,更加简单。
Java代码
packagenet.szh.zip;
importjava.io.File;
importorg.apache.tools.ant.Project;
importorg.apache.tools.ant.taskdefs.Zip;
importorg.apache.tools.ant.types.FileSet;
publicclassZipCompressorByAnt{
privateFilezipFile;
publicZipCompressorByAnt(StringpathName){
zipFile=newFile(pathName);
}
publicvoidcompress(StringsrcPathName){
Filesrcdir=newFile(srcPathName);
if(!srcdir.exists())
thrownewRuntimeException(srcPathName+"不存在!");
Projectprj=newProject();
Zipzip=newZip();
zip.setProject(prj);
zip.setDestFile(zipFile);
FileSetfileSet=newFileSet();
fileSet.setProject(prj);
fileSet.setDir(srcdir);
//fileSet.setIncludes("**/*.java");包括哪些文件或文件夹eg:zip.setIncludes("*.java");
//fileSet.setExcludes(...);排除哪些文件或文件夹
zip.addFileset(fileSet);
zip.execute();
}
}
测试一下
Java代码
packagenet.szh.zip;
publicclassTestZip{
publicstaticvoidmain(String[]args){
ZipCompressorzc=newZipCompressor("E:\\szhzip.zip");
press("E:\\test");
ZipCompressorByAntzca=newZipCompressorByAnt("E:\\szhzipant.zip");
press("E:\\test");
}
}