国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > Java > 正文

Java實現的zip工具類完整實例

2024-07-14 08:43:11
字體:
來源:轉載
供稿:網友

本文實例講述了Java實現的zip工具類。分享給大家供大家參考,具體如下:

實現把zip解壓到指定路徑,把文件夾壓縮到zip,把文件列表壓縮為zip的三個方法

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.nio.charset.Charset;import java.util.ArrayList;import java.util.Enumeration;import java.util.List;import java.util.zip.ZipEntry;import java.util.zip.ZipFile;import java.util.zip.ZipOutputStream;public class ZipUtils{  /**   * 解壓zip到指定路徑   * @param zipFile 待解壓文件   * @param descDir 指定解壓路徑   * @return fileNames 解壓的全部文件名   * @throws IOException   */  public static List<String> unZipFiles(File zipFile, String descDir) throws IOException {     List<String> fileNames = new ArrayList<String>();  ZipFile zip = new ZipFile(zipFile,Charset.forName("GBK"));//解決中文文件夾亂碼   String name = zip.getName().substring(zip.getName().lastIndexOf('//')+1, zip.getName().lastIndexOf('.'));   File pathFile = new File(descDir+name);   if (!pathFile.exists())   {    pathFile.mkdirs();   }   String outPath = "";  for (Enumeration<? extends ZipEntry> entries = zip.entries(); entries.hasMoreElements();)  {    ZipEntry entry = (ZipEntry) entries.nextElement();    String zipEntryName = entry.getName();    fileNames.add(zipEntryName);   InputStream in = zip.getInputStream(entry);    outPath = (descDir + name +"/"+ zipEntryName).replaceAll("//*", "/");    // 判斷路徑是否存在,不存在則創建文件路徑    File file = new File(outPath.substring(0, outPath.lastIndexOf('/')));    if (!file.exists())    {     file.mkdirs();    }    // 判斷文件全路徑是否為文件夾,如果是上面已經上傳,不需要解壓    if (new File(outPath).isDirectory())    {     continue;    }    // 輸出文件路徑信息    FileOutputStream out = new FileOutputStream(outPath);    byte[] buf1 = new byte[1024];    int len;    while ((len = in.read(buf1)) > 0) {     out.write(buf1, 0, len);    }    in.close();    out.close();   }   pathFile.delete();  return fileNames;  }  /**   * 壓縮文件夾成zip   * @param srcDir 待打包的文件夾路徑   * @param out 打包文件名及存儲路徑   * @param KeepDirStructure 是否保留文件夾結構 不保留則把文件夾下全部文件都打壓在一起   * @throws RuntimeException   */  public static void docToZip(String srcDir, OutputStream out, boolean KeepDirStructure)throws RuntimeException  {    long start = System.currentTimeMillis();    ZipOutputStream zos = null ;    try     {      zos = new ZipOutputStream(out);      File sourceFile = new File(srcDir);      compress(sourceFile,zos,sourceFile.getName(),KeepDirStructure);      long end = System.currentTimeMillis();      System.out.println("壓縮完成,耗時:" + (end - start) +" ms");    } catch (Exception e)     {      throw new RuntimeException("zip error from ZipUtils",e);    }finally    {      if(zos != null)      {        try         {          zos.close();        } catch (IOException e)        {          e.printStackTrace();        }      }    }  }  /**   * 壓縮成ZIP 將多個文件大包   * @param srcFiles 需要壓縮的文件列表   * @param out     壓縮文件輸出流   * @throws RuntimeException 壓縮失敗會拋出運行時異常   */  public static void filesToZip(List<File> srcFiles , OutputStream out)throws RuntimeException   {    long start = System.currentTimeMillis();    ZipOutputStream zos = null ;    int BUFFER_SIZE = 2 * 1024;    try     {      zos = new ZipOutputStream(out);      for (File srcFile : srcFiles)       {        byte[] buf = new byte[BUFFER_SIZE];        zos.putNextEntry(new ZipEntry(srcFile.getName()));        int len;        FileInputStream in = new FileInputStream(srcFile);        while ((len = in.read(buf)) != -1)        {          zos.write(buf, 0, len);        }        zos.closeEntry();        in.close();      }      long end = System.currentTimeMillis();      System.out.println("壓縮完成,耗時:" + (end - start) +" ms");    } catch (Exception e)     {      throw new RuntimeException("zip error from ZipUtils",e);    }finally    {      if(zos != null)      {        try         {          zos.close();        } catch (IOException e)        {          e.printStackTrace();        }      }    }  }  /**   * 遞歸壓縮方法   * @param sourceFile 源文件   * @param zos     zip輸出流   * @param name     壓縮后的名稱   * @param KeepDirStructure 是否保留原來的目錄結構,true:保留目錄結構;    *               false:所有文件跑到壓縮包根目錄下(注意:不保留目錄結構可能會出現同名文件,會壓縮失敗)   * @throws Exception   */  private static void compress(File sourceFile, ZipOutputStream zos, String name,      boolean KeepDirStructure) throws Exception  {    int BUFFER_SIZE = 2 * 1024;    byte[] buf = new byte[BUFFER_SIZE];    if(sourceFile.isFile())    {      // 向zip輸出流中添加一個zip實體,構造器中name為zip實體的文件的名字      zos.putNextEntry(new ZipEntry(name));      // copy文件到zip輸出流中      int len;      FileInputStream in = new FileInputStream(sourceFile);      while ((len = in.read(buf)) != -1)      {        zos.write(buf, 0, len);      }      // Complete the entry      zos.closeEntry();      in.close();    } else    {      File[] listFiles = sourceFile.listFiles();      if(listFiles == null || listFiles.length == 0)      {        // 需要保留原來的文件結構時,需要對空文件夾進行處理        if(KeepDirStructure)        {          // 空文件夾的處理          zos.putNextEntry(new ZipEntry(name + "/"));          // 沒有文件,不需要文件的copy          zos.closeEntry();        }      }else       {        for (File file : listFiles)         {          // 判斷是否需要保留原來的文件結構          if (KeepDirStructure)           {            // 注意:file.getName()前面需要帶上父文件夾的名字加一斜杠,            // 不然最后壓縮包中就不能保留原來的文件結構,即:所有文件都跑到壓縮包根目錄下了            compress(file, zos, name + "/" + file.getName(),KeepDirStructure);          } else           {            compress(file, zos, file.getName(),KeepDirStructure);          }        }      }    }  }}

 

希望本文所述對大家java程序設計有所幫助。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 洛隆县| 九江市| 连云港市| 邯郸市| 宣汉县| 桦川县| 股票| 五原县| 阳曲县| 贵阳市| 伊金霍洛旗| 成武县| 眉山市| 明溪县| 广饶县| 资源县| 库尔勒市| 安平县| 阿坝| 云梦县| 肃北| 当涂县| 涞源县| 宜阳县| 仁化县| 咸阳市| 遂溪县| 黄石市| 田林县| 宁陵县| 桂阳县| 新蔡县| 思南县| 舒城县| 陵川县| 扎鲁特旗| 左权县| 左权县| 环江| 建昌县| 灌云县|