Java实现Zip压缩与解压(解决中文乱码问题)

来源:互联网 发布:软件开发保密协议 编辑:程序博客网 时间:2024/05/10 21:42
解决中文压缩与解压问题 
使用的是org.apache.tools.zip包下面的相关类 
下面是自己写的类,可以设置和获取Zip文件的注释信息 

Java代码  
import java.io.File;   import java.io.FileInputStream;   import java.io.FileOutputStream;   import java.io.InputStream;   import java.util.ArrayList;   import java.util.Enumeration;   import java.util.List;      import org.apache.tools.zip.ZipEntry;   import org.apache.tools.zip.ZipFile;   import org.apache.tools.zip.ZipOutputStream;         public class ZipUtil {              private String comment = "";              public void setComment(String comment) {           this.comment = comment;       }                 public void zip(String src, String dest, List filter) throws Exception {           ZipOutputStream out = new ZipOutputStream(new FileOutputStream(dest));           File srcFile = new File(src);           zip(out,srcFile,"",filter);           out.close();       }                     public void zip(ZipOutputStream out, File srcFile, String base, List filter) throws Exception {           if(srcFile.exists()==false) {               throw new Exception("压缩目录不存在!");           }                      if(srcFile.isDirectory()) {               File[] files = srcFile.listFiles();               base = base.length() == 0 ? "" : base + "/";               if (isExist(base, filter)) {                   out.putNextEntry(new ZipEntry(base));               }               for(int i=0; i<files.length; i++) {                   zip(out,files[i],base + files[i].getName(),filter);               }           } else {               if (isExist(base, filter)) {                   base = base.length() == 0 ? srcFile.getName() : base ;                   ZipEntry zipEntry = new ZipEntry(base);                   zipEntry.setComment(comment);                   out.putNextEntry(zipEntry);                   FileInputStream in = new FileInputStream(srcFile);                   int length = 0;                   byte[] b = new byte[1024];                   while((length=in.read(b,0,1024))!=-1) {                       out.write(b,0,length);                   }                   in.close();               }           }       }                     public boolean isExist(String base, List list) {           if (list != null && !list.isEmpty()) {               for (int i = 0; i < list.size(); i++) {                   if (base.indexOf((String) list.get(i)) >= 0) {                       return true;                   }               }           }           return false;       }                     public void unZip(String srcFile,String dest,boolean deleteFile)  throws Exception {           File file = new File(srcFile);           if(!file.exists()) {               throw new Exception("解压文件不存在!");           }           ZipFile zipFile = new ZipFile(file);           Enumeration e = zipFile.getEntries();           while(e.hasMoreElements()) {               ZipEntry zipEntry = (ZipEntry)e.nextElement();               if(zipEntry.isDirectory()) {                   String name = zipEntry.getName();                   name = name.substring(0,name.length()-1);                   File f = new File(dest + name);                   f.mkdirs();               } else {                   File f = new File(dest + zipEntry.getName());                   f.getParentFile().mkdirs();                   f.createNewFile();                   InputStream is = zipFile.getInputStream(zipEntry);                   FileOutputStream fos = new FileOutputStream(f);                   int length = 0;                   byte[] b = new byte[1024];                   while((length=is.read(b, 0, 1024))!=-1) {                       fos.write(b, 0, length);                   }                   is.close();                   fos.close();               }           }                      if (zipFile != null) {               zipFile.close();           }                      if(deleteFile) {               file.deleteOnExit();           }       }                     public static String getZipComment(String srcFile) {           String comment = "";           try {               ZipFile zipFile = new ZipFile(srcFile);               Enumeration e = zipFile.getEntries();                  while (e.hasMoreElements()) {                   ZipEntry ze = (ZipEntry) e.nextElement();                      comment = ze.getComment();                   if (comment != null && !comment.equals("")                           && !comment.equals("null")) {                       break;                   }               }                  zipFile.close();           } catch (Exception e) {               System.out.println("获取zip文件注释信息失败:" + e.getMessage());           }              return comment;       }          public static void main(String[] args) throws Exception {           long begin = System.currentTimeMillis();           ZipUtil zu = new ZipUtil();           List<String> filter = new ArrayList<String>();           filter.add("3RDPARTY");           filter.add("BANNER.GIF");           zu.setComment("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");           zu.zip("C:/VALUEADD", "c:/hh.zip",filter);           System.out.println(ZipUtil.getZipComment("c:/hh.zip"));           //new ZipUtil().unZip("c:/tt.zip", "c:/mmmmmmmmmmmmmmmmmmm/", true);           //File f = new File("c:/hh.zip");           //f.deleteOnExit();           long end = System.currentTimeMillis();           System.out.println(end-begin);       }   }     如果不需要上面的filter,可以添加fileter为空list或者用下面的程序: 不带filter的zip压缩: // // * @author WeiMiao // * @param out: ZipOutputStream // * @param srcFile: 要压缩的目录 // * @param base: 根路径 // * @throws Exception // public static void zip(ZipOutputStream out, File srcFile, String base) throws Exception {     if (!srcFile.exists()) {         throw new Exception("压缩目录不存在!");     }     if (srcFile.isDirectory()) {         File[] files = srcFile.listFiles();         base = base.length() == 0 ? "" : base + "/";         if (base.length() > 0) {             out.putNextEntry(new ZipEntry(base));         }         for (int i = 0; i < files.length; i++) {             zip(out, files[i], base + files[i].getName());         }     } else {         base = base.length() == 0 ? srcFile.getName() : base;         out.putNextEntry(new ZipEntry(base));         FileInputStream fis = new FileInputStream(srcFile);         int length = 0;         byte[] b = new byte[BUFFER];         while ((length = fis.read(b, 0, BUFFER)) != -1) {             out.write(b, 0, length);         }         fis.close();     } }