天天看點

Java Zip/Unzip Files 記錄

最近項目中使用Java實作zip/unzip XML檔案的功能,Java自帶的API可以友善實作檔案的壓縮和解壓縮,記錄一下相關代碼。

  1. 以源檔案名zip壓縮源檔案到目标檔案
public void zip(File src, File dest){
    InputStream in = null; 
    ZipOutputStream zos= null;
    try { 
        zos = new ZipOutputStream(new FileOutputStream(dest));
        ZipEntry ze= new ZipEntry(src.getName());
        zos.putNextEntry(ze);
        in = new FileInputStream(src);
        IOUtils.copy(in,zos); 
    } catch (IOException e) {
        LOG.error("fail to zip file: " + src.getName() + " to : " + dest.getName()); 
        throw e;
    } finally {
        if(null != zos){
            try {
                zos.closeEntry();
            } catch (IOException ex){
            }
        }
        IOUtils.closeQuietly(in);
        IOUtils.closeQuietly(zos);
}
           
  1. 從源檔案zip解壓所有檔案到目标檔案夾
public void unZip(File file, String outputFolder){ 
     File folder = new File(outputFolder);
     if(folder.exists() && folder.isFile()){ 
         throw IllegalArgumentException("Not an exists folder"); 
     }
     //create output directory is not exists
     if(!folder.exists() && !folder.mkdir()){
         throw IllegalStatusException("fail to create dest folder");
     }
     InputStream in = null; OutputStream out = null;
     ZipFile zipFile = new ZipFile(file); 
     Enumeration emu = zipFile.entries();
     while(emu.hasMoreElements()){
           ZipEntry entry = (ZipEntry)emu.nextElement();
           //建立目錄
           if (entry.isDirectory()){
                new File(outputFolder + entry.getName()).mkdirs();
                    continue;
           }
           //檔案拷貝
           InputStream is = zipFile.getInputStream(entry);
           File file = new File(outputFolder + entry.getName());
           //注意:zipfile讀取檔案是随機讀取的,可能先讀取一個檔案,再讀取檔案夾,是以可能要先建立目錄
           File parent = file.getParentFile();
           if(parent != null && (!parent.exists())){
               parent.mkdirs();
           }
           out = new FileOutputStream(file);
           IOUtils.closeQuietly(in);
           IOUtils.closeQuietly(out);
       } 
    }catch(IOException ex){
       LOG.error(ex.getMessage());
       throw ex;
    } finally {
       if(null != zipFile){
           try{
               zipFile.close();
           } catch (IOException e) {

           }
       }
       IOUtils.closeQuietly(in);
       IOUtils.closeQuietly(out);
    } 
}
           

這代碼最主要就是檔案太大的話,IOUtils的copy耗CPU比較高。