Android實現zip檔案壓縮及解壓縮的方法_Android

來源:互聯網
上載者:User

本文執行個體講述了Android實現zip檔案壓縮及解壓縮的方法。分享給大家供大家參考。具體如下:

DirTraversal.java如下:

package com.once;import java.io.File;import java.util.ArrayList;import java.util.LinkedList;/** * 檔案夾遍曆 * @author once * */public class DirTraversal {  //no recursion  public static LinkedList<File> listLinkedFiles(String strPath) {    LinkedList<File> list = new LinkedList<File>();    File dir = new File(strPath);    File file[] = dir.listFiles();    for (int i = 0; i < file.length; i++) {      if (file[i].isDirectory())        list.add(file[i]);      else        System.out.println(file[i].getAbsolutePath());    }    File tmp;    while (!list.isEmpty()) {      tmp = (File) list.removeFirst();      if (tmp.isDirectory()) {        file = tmp.listFiles();        if (file == null)          continue;        for (int i = 0; i < file.length; i++) {          if (file[i].isDirectory())            list.add(file[i]);          else            System.out.println(file[i].getAbsolutePath());        }      } else {        System.out.println(tmp.getAbsolutePath());      }    }    return list;  }  //recursion  public static ArrayList<File> listFiles(String strPath) {    return refreshFileList(strPath);  }  public static ArrayList<File> refreshFileList(String strPath) {    ArrayList<File> filelist = new ArrayList<File>();    File dir = new File(strPath);    File[] files = dir.listFiles();    if (files == null)      return null;    for (int i = 0; i < files.length; i++) {      if (files[i].isDirectory()) {        refreshFileList(files[i].getAbsolutePath());      } else {        if(files[i].getName().toLowerCase().endsWith("zip"))          filelist.add(files[i]);      }    }    return filelist;  }}

ZipUtils.java如下:

package com.once;import java.io.*;import java.util.ArrayList;import java.util.Collection;import java.util.Enumeration;import java.util.zip.ZipEntry;import java.util.zip.ZipException;import java.util.zip.ZipFile;import java.util.zip.ZipOutputStream;/** * Java utils 實現的Zip工具 * * @author once */public class ZipUtils {  private static final int BUFF_SIZE = 1024 * 1024; // 1M Byte  /**   * 批量壓縮檔(夾)   *   * @param resFileList 要壓縮的檔案(夾)列表   * @param zipFile 產生的壓縮檔   * @throws IOException 當壓縮過程出錯時拋出   */  public static void zipFiles(Collection<File> resFileList, File zipFile) throws IOException {    ZipOutputStream zipout = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(        zipFile), BUFF_SIZE));    for (File resFile : resFileList) {      zipFile(resFile, zipout, "");    }    zipout.close();  }  /**   * 批量壓縮檔(夾)   *   * @param resFileList 要壓縮的檔案(夾)列表   * @param zipFile 產生的壓縮檔   * @param comment 壓縮檔的注釋   * @throws IOException 當壓縮過程出錯時拋出   */  public static void zipFiles(Collection<File> resFileList, File zipFile, String comment)      throws IOException {    ZipOutputStream zipout = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(        zipFile), BUFF_SIZE));    for (File resFile : resFileList) {      zipFile(resFile, zipout, "");    }    zipout.setComment(comment);    zipout.close();  }  /**   * 解壓縮一個檔案   *   * @param zipFile 壓縮檔   * @param folderPath 解壓縮的目標目錄   * @throws IOException 當解壓縮過程出錯時拋出   */  public static void upZipFile(File zipFile, String folderPath) throws ZipException, IOException {    File desDir = new File(folderPath);    if (!desDir.exists()) {      desDir.mkdirs();    }    ZipFile zf = new ZipFile(zipFile);    for (Enumeration<?> entries = zf.entries(); entries.hasMoreElements();) {      ZipEntry entry = ((ZipEntry)entries.nextElement());      InputStream in = zf.getInputStream(entry);      String str = folderPath + File.separator + entry.getName();      str = new String(str.getBytes("8859_1"), "GB2312");      File desFile = new File(str);      if (!desFile.exists()) {        File fileParentDir = desFile.getParentFile();        if (!fileParentDir.exists()) {          fileParentDir.mkdirs();        }        desFile.createNewFile();      }      OutputStream out = new FileOutputStream(desFile);      byte buffer[] = new byte[BUFF_SIZE];      int realLength;      while ((realLength = in.read(buffer)) > 0) {        out.write(buffer, 0, realLength);      }      in.close();      out.close();    }  }  /**   * 解壓檔案名稱包含傳入文字的檔案   *   * @param zipFile 壓縮檔   * @param folderPath 目標檔案夾   * @param nameContains 傳入的檔案匹配名   * @throws ZipException 壓縮格式有誤時拋出   * @throws IOException IO錯誤時拋出   */  public static ArrayList<File> upZipSelectedFile(File zipFile, String folderPath,      String nameContains) throws ZipException, IOException {    ArrayList<File> fileList = new ArrayList<File>();     File desDir = new File(folderPath);    if (!desDir.exists()) {      desDir.mkdir();    }    ZipFile zf = new ZipFile(zipFile);    for (Enumeration<?> entries = zf.entries(); entries.hasMoreElements();) {      ZipEntry entry = ((ZipEntry)entries.nextElement());      if (entry.getName().contains(nameContains)) {        InputStream in = zf.getInputStream(entry);        String str = folderPath + File.separator + entry.getName();        str = new String(str.getBytes("8859_1"), "GB2312");        // str.getBytes("GB2312"),"8859_1" 輸出        // str.getBytes("8859_1"),"GB2312" 輸入        File desFile = new File(str);        if (!desFile.exists()) {          File fileParentDir = desFile.getParentFile();          if (!fileParentDir.exists()) {            fileParentDir.mkdirs();          }          desFile.createNewFile();        }        OutputStream out = new FileOutputStream(desFile);        byte buffer[] = new byte[BUFF_SIZE];        int realLength;        while ((realLength = in.read(buffer)) > 0) {          out.write(buffer, 0, realLength);        }        in.close();        out.close();        fileList.add(desFile);      }    }    return fileList;  }  /**   * 獲得壓縮檔內檔案清單   *   * @param zipFile 壓縮檔   * @return 壓縮檔內檔案名稱   * @throws ZipException 壓縮檔格式有誤時拋出   * @throws IOException 當解壓縮過程出錯時拋出   */  public static ArrayList<String> getEntriesNames(File zipFile) throws ZipException, IOException {    ArrayList<String> entryNames = new ArrayList<String>();    Enumeration<?> entries = getEntriesEnumeration(zipFile);    while (entries.hasMoreElements()) {      ZipEntry entry = ((ZipEntry)entries.nextElement());      entryNames.add(new String(getEntryName(entry).getBytes("GB2312"), "8859_1"));    }    return entryNames;  }  /**   * 獲得壓縮檔內壓縮檔對象以取得其屬性   *   * @param zipFile 壓縮檔   * @return 返回一個壓縮檔列表   * @throws ZipException 壓縮檔格式有誤時拋出   * @throws IOException IO操作有誤時拋出   */  public static Enumeration<?> getEntriesEnumeration(File zipFile) throws ZipException,      IOException {    ZipFile zf = new ZipFile(zipFile);    return zf.entries();  }  /**   * 取得壓縮檔對象的注釋   *   * @param entry 壓縮檔對象   * @return 壓縮檔對象的注釋   * @throws UnsupportedEncodingException   */  public static String getEntryComment(ZipEntry entry) throws UnsupportedEncodingException {    return new String(entry.getComment().getBytes("GB2312"), "8859_1");  }  /**   * 取得壓縮檔對象的名稱   *   * @param entry 壓縮檔對象   * @return 壓縮檔對象的名稱   * @throws UnsupportedEncodingException   */  public static String getEntryName(ZipEntry entry) throws UnsupportedEncodingException {    return new String(entry.getName().getBytes("GB2312"), "8859_1");  }  /**   * 壓縮檔   *   * @param resFile 需要壓縮的檔案(夾)   * @param zipout 壓縮的目的檔案   * @param rootpath 壓縮的檔案路徑   * @throws FileNotFoundException 找不到檔案時拋出   * @throws IOException 當壓縮過程出錯時拋出   */  private static void zipFile(File resFile, ZipOutputStream zipout, String rootpath)      throws FileNotFoundException, IOException {    rootpath = rootpath + (rootpath.trim().length() == 0 ? "" : File.separator)        + resFile.getName();    rootpath = new String(rootpath.getBytes("8859_1"), "GB2312");    if (resFile.isDirectory()) {      File[] fileList = resFile.listFiles();      for (File file : fileList) {        zipFile(file, zipout, rootpath);      }    } else {      byte buffer[] = new byte[BUFF_SIZE];      BufferedInputStream in = new BufferedInputStream(new FileInputStream(resFile),          BUFF_SIZE);      zipout.putNextEntry(new ZipEntry(rootpath));      int realLength;      while ((realLength = in.read(buffer)) != -1) {        zipout.write(buffer, 0, realLength);      }      in.close();      zipout.flush();      zipout.closeEntry();    }  }}

希望本文所述對大家的Android程式設計有所協助。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.