java实现zip压缩文件 (一)

网上查了许久,最后发现三种不错的方法:

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 */public File doZip(String sourceDir, String zipFilePath) throws IOException {File file = new File(sourceDir);File zipFile = new File(zipFilePath);ZipOutputStream zos = null;try {// 创建写出流操作OutputStream os = new FileOutputStream(zipFile);BufferedOutputStream bos = new BufferedOutputStream(os);zos = new ZipOutputStream(bos);String basePath = 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;}

/** * @param source 源文件 * @param basePath * @param zos */private void zipFile(File source, String basePath, ZipOutputStream zos) throws IOException {File[] files = null;if (source.isDirectory()) {files = source.listFiles();} else {files = new File[1];files[0] = source;}InputStream is = null;String pathName;byte[] buf = new byte[1024];int length = 0;try{for(File file : files) {if(file.isDirectory()) {pathName = file.getPath().substring(basePath.length() + 1) + "/";zos.putNextEntry(new ZipEntry(pathName));zipFile(file, basePath, zos);}else {pathName = file.getPath().substring(basePath.length() + 1);is = new FileInputStream(file);BufferedInputStream bis = 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()); this.compressDirectory(file,out,basedir); }else{ System.out.println("压缩:"+basedir+file.getName()); this.compressFile(file,out,basedir); } } /**压缩一个目录*/privatevoidcompressDirectory(Filedir,ZipOutputStreamout,Stringbasedir){ if(!dir.exists()) return; File[]files=dir.listFiles(); for(inti=0;i<files.length;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"); zc.compress("E:\\test"); ZipCompressorByAntzca=newZipCompressorByAnt("E:\\szhzipant.zip"); zca.compress("E:\\test"); } }

第一个青春是上帝给的;第二个的青春是*自己努力的

java实现zip压缩文件 (一)

相关文章:

你感兴趣的文章:

标签云: