zip格式压缩和解压缩(支持中文和文件嵌套解压缩)

我在公司项目过程需要用到zip文件的压缩与解压的功能,于是自己研究了一下,找了一些,自己写了一个压缩和解压缩的代码,支持中文,可以文件嵌套(注意其中所用的类是ant.jar中的包中的类,我用的是1.6.0版本)

/**
   *用于对指定源文件路径下的所有文件压缩到指定的文件中
   * 
@param des String 需要压缩成的文件名
   * 
@param src String 压缩文件源路径,可以是文件或文件夹
   * 
@return boolean  如果压缩成功返回true,否则表示失败
   
*/

  
public static boolean File2Zip(String des, String src) {

    
boolean success = true//压缩成功标志
    File srcpath = new File(src);
    ZipOutputStream out 
= null;
    
try {
      out 
= new ZipOutputStream(new FileOutputStream(new File(
          des))); 
//创建压缩输出流
      out.setEncoding("gbk");
      compress(srcpath, out, 
""); //开始压缩
    }

    
catch (FileNotFoundException ex) {
          success 
= false;
    }

    
catch (IOException ex1) {
      success 
= false;
    }

    
finally {
      
if (out != null{
        
try {
          out.close();
        }

        
catch (IOException ex2) {
        }

      }

    }

    
return success;
  }


  
/**
   *
   * 
@param src File
   * 
@param out ZipOutputStream
   * 
@param base String
   * 
@throws IOException
   
*/

  
public static void compress(File src, ZipOutputStream out, String base) throws
      IOException 
{
    
if (src.isDirectory()) //如果是目录
      File[] files = src.listFiles(); //列举出目录中所有的内容
      out.putNextEntry(new ZipEntry(base + "/")); //放入一级目录
      base = base.length() == 0 ? "" : base + "/";
      
for (int i = 0; i < files.length; i++{
        compress(files[i], out, base 
+ files[i].getName());
      }


    }

    
else //如果是文件
        if("".equals(base)){
            out.putNextEntry(
new ZipEntry(base+"/"));
            base
=src.getName();
        }

      out.putNextEntry(
new ZipEntry(base));
      FileInputStream in 
= new FileInputStream(src);
      
byte []data=new byte[4096];
      
int b;
      
while((b=in.read(data))!=-1){
        out.write(data,
0,b);
      }

      in.close();

    }

  }

  
/**
   * 解压缩文件
   * 
@param src String  zip所在路径c:/test/kk.zip
   * 
@param des String 希望存放的目录
 * 
@throws IOException
   * 
@throws IOException
   
*/

  
public static void decompress(String src, String des) throws IOException
     
{
      ZipFile file
=null;
      FileOutputStream fout
=null;
      DataOutputStream dout
=null;
      
try{
        file
=new ZipFile(src);
        InputStream in
=null;
      des
=des.replace('/''/');
      
if(des.startsWith("//")){
          des
=des.replaceFirst("//""//");
      }

     Enumeration  en
=file.getEntries();
   
while(en.hasMoreElements()){
     ZipEntry entry
=(ZipEntry)en.nextElement();
     
if(entry.isDirectory()){//文件夹
         File directory=new File(des+"/"+entry.getName());
         
if(!directory.exists())
             directory.mkdirs();
     }
else{//文件
         String path=entry.getName();
         path
=path.replace('/''/');
         
if(path.startsWith("//")){
             path
=path.replaceFirst("//""//");
            }

         
int pos=path.lastIndexOf('/');
         
if(pos!=-1){
             path
=path.substring(0, pos+1);
             File d
=new File(des+"/"+path);
             
if(!d.exists())
               d.mkdirs();
         }

         
try{
         File files
=new File(entry.getName());
         File f
=new File(des+"/"+files.getPath());

         fout
=new FileOutputStream(f);
         dout
=new DataOutputStream(fout);
         in
=file.getInputStream(entry);

         
byte[] b=new byte[4096];
          
int len = 0;
          
while ( (len = in.read(b)) != -1{
            dout.write(b, 
0, len);
          }


         }
catch(IOException e){
             
throw e;
         }
finally{
             
if(fout!=null)
              fout.close();
             
if(dout!=null)
              dout.close();
             
if(in!=null)
              in.close();
         }

     }

   }

      }
catch(IOException e){
          
throw e;
      }
finally{
          
if(file!=null)
              file.close();
          
if(fout!=null)
              fout.close();
          
if(dout!=null)
              dout.close();
      }

  }

  
/**
   * 解压缩zip文件
   * 
@param src String
   * 
@param des String
   * 
@return boolean 成功返回true;
   
*/

  
public static boolean zipDecompress(String src, String des) {
    
boolean success = true;
    
try {
      decompress(src, des);
    }

    
catch (FileNotFoundException ex) {
        ex.printStackTrace();
      success 
= false;
    }

    
catch (IOException ex) {
        ex.printStackTrace();
      success 
= false;
    }


    
return success;
  }

该类有很多不完善的地方,各位可以提意见,共同交流,谢谢

posted @ 2006-12-31 13:15  lovingprince  阅读(706)  评论(0编辑  收藏  举报