用java实现zip压缩

java压缩的功能,可以实现对文件和目录的压缩。

由于java.util.zip.ZipOutputStream有中文乱码问题,所以采用org.apache.tools.zip.ZipOutputStream。
以下是代码:
Java代码 收藏代码
  1. packagenet.szh.zip;
  2. importjava.io.BufferedInputStream;
  3. importjava.io.File;
  4. importjava.io.FileInputStream;
  5. importjava.io.FileOutputStream;
  6. importjava.util.zip.CRC32;
  7. importjava.util.zip.CheckedOutputStream;
  8. importorg.apache.tools.zip.ZipEntry;
  9. importorg.apache.tools.zip.ZipOutputStream;
  10. publicclassZipCompressor{
  11. staticfinalintBUFFER=8192;
  12. privateFilezipFile;
  13. publicZipCompressor(StringpathName){
  14. zipFile=newFile(pathName);
  15. }
  16. publicvoidcompress(StringsrcPathName){
  17. Filefile=newFile(srcPathName);
  18. if(!file.exists())
  19. thrownewRuntimeException(srcPathName+"不存在!");
  20. try{
  21. FileOutputStreamfileOutputStream=newFileOutputStream(zipFile);
  22. CheckedOutputStreamcos=newCheckedOutputStream(fileOutputStream,
  23. newCRC32());
  24. ZipOutputStreamout=newZipOutputStream(cos);
  25. Stringbasedir="";
  26. compress(file,out,basedir);
  27. out.close();
  28. }catch(Exceptione){
  29. thrownewRuntimeException(e);
  30. }
  31. }
  32. privatevoidcompress(Filefile,ZipOutputStreamout,Stringbasedir){
  33. /*判断是目录还是文件*/
  34. if(file.isDirectory()){
  35. System.out.println("压缩:"+basedir+file.getName());
  36. this.compressDirectory(file,out,basedir);
  37. }else{
  38. System.out.println("压缩:"+basedir+file.getName());
  39. this.compressFile(file,out,basedir);
  40. }
  41. }
  42. /**压缩一个目录*/
  43. privatevoidcompressDirectory(Filedir,ZipOutputStreamout,Stringbasedir){
  44. if(!dir.exists())
  45. return;
  46. File[]files=dir.listFiles();
  47. for(inti=0;i<files.length;i++){
  48. /*递归*/
  49. compress(files[i],out,basedir+dir.getName()+"/");
  50. }
  51. }
  52. /**压缩一个文件*/
  53. privatevoidcompressFile(Filefile,ZipOutputStreamout,Stringbasedir){
  54. if(!file.exists()){
  55. return;
  56. }
  57. try{
  58. BufferedInputStreambis=newBufferedInputStream(
  59. newFileInputStream(file));
  60. ZipEntryentry=newZipEntry(basedir+file.getName());
  61. out.putNextEntry(entry);
  62. intcount;
  63. bytedata[]=newbyte[BUFFER];
  64. while((count=bis.read(data,0,BUFFER))!=-1){
  65. out.write(data,0,count);
  66. }
  67. bis.close();
  68. }catch(Exceptione){
  69. thrownewRuntimeException(e);
  70. }
  71. }
  72. }


后来发现原来可以用ant中的org.apache.tools.ant.taskdefs.Zip来实现,更加简单。
Java代码 收藏代码
  1. packagenet.szh.zip;
  2. importjava.io.File;
  3. importorg.apache.tools.ant.Project;
  4. importorg.apache.tools.ant.taskdefs.Zip;
  5. importorg.apache.tools.ant.types.FileSet;
  6. publicclassZipCompressorByAnt{
  7. privateFilezipFile;
  8. publicZipCompressorByAnt(StringpathName){
  9. zipFile=newFile(pathName);
  10. }
  11. publicvoidcompress(StringsrcPathName){
  12. Filesrcdir=newFile(srcPathName);
  13. if(!srcdir.exists())
  14. thrownewRuntimeException(srcPathName+"不存在!");
  15. Projectprj=newProject();
  16. Zipzip=newZip();
  17. zip.setProject(prj);
  18. zip.setDestFile(zipFile);
  19. FileSetfileSet=newFileSet();
  20. fileSet.setProject(prj);
  21. fileSet.setDir(srcdir);
  22. //fileSet.setIncludes("**/*.java");包括哪些文件或文件夹eg:zip.setIncludes("*.java");
  23. //fileSet.setExcludes(...);排除哪些文件或文件夹
  24. zip.addFileset(fileSet);
  25. zip.execute();
  26. }
  27. }

测试一下 (把test目录 压缩成szhzip.zip)
Java代码 收藏代码
  1. packagenet.szh.zip;
  2. publicclassTestZip{
  3. publicstaticvoidmain(String[]args){
  4. ZipCompressorzc=newZipCompressor("E:\\szhzip.zip");
  5. zc.compress("E:\\test");
  6. ZipCompressorByAntzca=newZipCompressorByAnt("E:\\szhzipant.zip");
  7. zca.compress("E:\\test");
  8. }
  9. }
转自:http://szhnet.iteye.com/blog/199059

你可能感兴趣的:(java实现)