java压缩的功能,可以实现对文件和目录的压缩。
由于java.util.zip.ZipOutputStream有中文乱码问题,所以采用org.apache.tools.zip.ZipOutputStream。
以下是代码:
后来发现原来可以用ant中的org.apache.tools.ant.taskdefs.Zip来实现,更加简单。
测试一下 (把test目录 压缩成szhzip.zip)
转自:http://szhnet.iteye.com/blog/199059
由于java.util.zip.ZipOutputStream有中文乱码问题,所以采用org.apache.tools.zip.ZipOutputStream。
以下是代码:
- 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);
- }
- }
- }
后来发现原来可以用ant中的org.apache.tools.ant.taskdefs.Zip来实现,更加简单。
- 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();
- }
- }
测试一下 (把test目录 压缩成szhzip.zip)
- 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");
- }
- }