文件压缩与解压

来源:互联网 发布:找租房的软件 编辑:程序博客网 时间:2024/04/30 11:52

package com.pure.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;

import org.apache.tools.zip.ZipFile;
import org.apache.tools.zip.ZipOutputStream;
import org.apache.tools.zip.ZipEntry;
/**
 * 文件压缩工具,封装文件压缩/解压的常用操作
 * 利用ant.jar包,全面解决中文问题
 * @author YangXG 20050812
 */
public class DataCondensater {

 /**
  * 压缩单个文件,并将压缩后生成的文件放到指定目录
  * @param inputFileName        要压缩的文件
  * @param outputFile           压缩文件存储目录
  * @throws IOException
  */
 public static void zipFile(String inputFileName, String outputDir) throws IOException {
  File inputFile=new File(inputFileName);
  FileInputStream in = new FileInputStream(inputFile);
  String outputFile=outputDir+File.separator+inputFile.getName().substring(0,inputFile.getName().lastIndexOf("."))+".zip";
  ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(outputFile));
  zipOut.putNextEntry(new ZipEntry(inputFile.getName()));
  byte[] b = new byte[1024 * 5];
  int len;
  while ((len = in.read(b)) != -1) {
   zipOut.write(b, 0, len);
  }
  in.close();
  zipOut.flush();
  zipOut.close();
  System.out.println("Successfully finish to zip file: "+inputFile.getName());
 }
 
 /**
  * 将某个目录下的所有文件压缩后存储到指定路径
  * @param Dir                压缩目录
  * @param outputDir          压缩包存放目录
  * @throws IOException
  */
 public static void zipDir(String Dir,String outputDir) throws IOException{
  File dir=new File(Dir);
  if(!dir.isDirectory()){return;}
  String savedir=outputDir+File.separator+dir.getName()+".zip";
  ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(savedir));
  zipPrivate(zipOut,dir,dir.getName());
  zipOut.flush();
  zipOut.close();
  System.out.println("Successfully finish to zip directory: "+dir.getName());
 }
 
 private static void zipPrivate(ZipOutputStream out,File file,String base) throws IOException{
  File[] files=file.listFiles(); 
  base=(base==""?"":(base+"/"));  
  for (int i = 0; i < files.length; i++) {
   if(files[i].isDirectory()){
    zipPrivate(out,files[i],base+files[i].getName());  
   }else{  
    String entryName=base+files[i].getName();    
    out.putNextEntry(new ZipEntry(entryName));
    FileInputStream in = new FileInputStream(files[i]);
    byte[] b = new byte[1024 * 5];
    int len;
    while ((len = in.read(b)) != -1) {
     out.write(b, 0, len);
    }
    in.close();
   }
  }  
 } 
 
 /**
  * 将zip文件解压到指定路径
  * @param zipFile
  * @param outputDir
  * @throws IOException
  */
 public static void unzip(String zipFile,String outputDir) throws IOException{
  ZipFile zip=new ZipFile(zipFile);
  ZipEntry entry;
  InputStream inputStream;
  OutputStream out;
  Enumeration enumer=zip.getEntries();
  while(enumer.hasMoreElements()){
   entry=(ZipEntry) enumer.nextElement();
   String tmpname=outputDir+File.separator+entry.getName();
   File tmpFile=new File(tmpname);
   if(entry.isDirectory()){
    tmpFile.mkdir();
   }else{
    try {
     tmpFile.createNewFile();     
    } catch (IOException e) {
     if(!tmpFile.getParentFile().exists()){
      tmpFile.getParentFile().mkdirs();
     }
    }
    out=new FileOutputStream(tmpFile);
    inputStream=zip.getInputStream(entry);
    byte[] b = new byte[1024 * 2];
    int len;
    while ((len = inputStream.read(b)) != -1) {
     out.write(b, 0, len);
    }
    out.flush();
    out.close();
   }
   
  }
  zip.close();
 }
 
 public static void main(String[] args) throws IOException{
  String input="D://tmp//temp.zip";
  String output="C://temp";
  try {
   unzip(input,output);   
  } catch (Exception e) {
   e.printStackTrace();
  }
 }
}