用java实现zip压缩
今天写了个用java压缩的功能,可以实现对文件和目录的压缩。?
由于java.util.zip.ZipOutputStream有中文乱码问题,所以采用org.apache.tools.zip.ZipOutputStream。?
以下是代码:?

- package?net.szh.zip;??
- ??
- import?java.io.BufferedInputStream;??
- import?java.io.File;??
- import?java.io.FileInputStream;??
- import?java.io.FileOutputStream;??
- import?java.util.zip.CRC32;??
- import?java.util.zip.CheckedOutputStream;??
- ??
- import?org.apache.tools.zip.ZipEntry;??
- import?org.apache.tools.zip.ZipOutputStream;??
- ??
- public?class?ZipCompressor?{??
- ????static?final?int?BUFFER?=?8192;??
- ??
- ????private?File?zipFile;??
- ??
- ????public?ZipCompressor(String?pathName)?{??
- ????????zipFile?=?new?File(pathName);??
- ????}??
- ??
- ????public?void?compress(String?srcPathName)?{??
- ????????File?file?=?new?File(srcPathName);??
- ????????if?(!file.exists())??
- ????????????throw?new?RuntimeException(srcPathName?+?"不存在!");??
- ????????try?{??
- ????????????FileOutputStream?fileOutputStream?=?new?FileOutputStream(zipFile);??
- ????????????CheckedOutputStream?cos?=?new?CheckedOutputStream(fileOutputStream,??
- ????????????????????new?CRC32());??
- ????????????ZipOutputStream?out?=?new?ZipOutputStream(cos);??
- ????????????String?basedir?=?"";??
- ????????????compress(file,?out,?basedir);??
- ????????????out.close();??
- ????????}?catch?(Exception?e)?{??
- ????????????throw?new?RuntimeException(e);??
- ????????}??
- ????}??
- ??
- ????private?void?compress(File?file,?ZipOutputStream?out,?String?basedir)?{??
- ????????/*?判断是目录还是文件?*/??
- ????????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);??
- ????????}??
- ????}??
- ??
- ????/**?压缩一个目录?*/??
- ????private?void?compressDirectory(File?dir,?ZipOutputStream?out,?String?basedir)?{??
- ????????if?(!dir.exists())??
- ????????????return;??
- ??
- ????????File[]?files?=?dir.listFiles();??
- ????????for?(int?i?=?0;?i?<?files.length;?i++)?{??
- ????????????/*?递归?*/??
- ????????????compress(files[i],?out,?basedir?+?dir.getName()?+?"/");??
- ????????}??
- ????}??
- ??
- ????/**?压缩一个文件?*/??
- ????private?void?compressFile(File?file,?ZipOutputStream?out,?String?basedir)?{??
- ????????if?(!file.exists())?{??
- ????????????return;??
- ????????}??
- ????????try?{??
- ????????????BufferedInputStream?bis?=?new?BufferedInputStream(??
- ????????????????????new?FileInputStream(file));??
- ????????????ZipEntry?entry?=?new?ZipEntry(basedir?+?file.getName());??
- ????????????out.putNextEntry(entry);??
- ????????????int?count;??
- ????????????byte?data[]?=?new?byte[BUFFER];??
- ????????????while?((count?=?bis.read(data,?0,?BUFFER))?!=?-1)?{??
- ????????????????out.write(data,?0,?count);??
- ????????????}??
- ????????????bis.close();??
- ????????}?catch?(Exception?e)?{??
- ????????????throw?new?RuntimeException(e);??
- ????????}??
- ????}??
- }??
后来发现原来可以用ant中的org.apache.tools.ant.taskdefs.Zip来实现,更加简单。

- package?net.szh.zip;??
- ??
- import?java.io.File;??
- ??
- import?org.apache.tools.ant.Project;??
- import?org.apache.tools.ant.taskdefs.Zip;??
- import?org.apache.tools.ant.types.FileSet;??
- ??
- public?class?ZipCompressorByAnt?{??
- ??
- ????private?File?zipFile;??
- ??
- ????public?ZipCompressorByAnt(String?pathName)?{??
- ????????zipFile?=?new?File(pathName);??
- ????}??
- ??????
- ????public?void?compress(String?srcPathName)?{??
- ????????File?srcdir?=?new?File(srcPathName);??
- ????????if?(!srcdir.exists())??
- ????????????throw?new?RuntimeException(srcPathName?+?"不存在!");??
- ??????????
- ????????Project?prj?=?new?Project();??
- ????????Zip?zip?=?new?Zip();??
- ????????zip.setProject(prj);??
- ????????zip.setDestFile(zipFile);??
- ????????FileSet?fileSet?=?new?FileSet();??
- ????????fileSet.setProject(prj);??
- ????????fileSet.setDir(srcdir);??
- ????????//fileSet.setIncludes("**/*.java");?包括哪些文件或文件夹?eg:zip.setIncludes("*.java");??
- ????????//fileSet.setExcludes(...);?排除哪些文件或文件夹??
- ????????zip.addFileset(fileSet);??
- ??????????
- ????????zip.execute();??
- ????}??
- }??
测试一下

- package?net.szh.zip;??
- ??
- public?class?TestZip?{??
- ????public?static?void?main(String[]?args)?{??
- ????????ZipCompressor?zc?=?new??ZipCompressor("E:\\szhzip.zip");??
- ????????zc.compress("E:\\test");??
- ??????????
- ????????ZipCompressorByAnt?zca?=?new?ZipCompressorByAnt("E:\\szhzipant.zip");??
- ????????zca.compress("E:\\test");??
- ????}??
- } ?
?