Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android中的Zip解壓縮

Android中的Zip解壓縮

編輯:關於Android編程

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
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;

/**
 * Android Zip壓縮解壓縮
 */
public class Unzip {
	
	private static final int BUFF_SIZE = 1024 * 1024; // 1M Byte
	 
    /**
     * 批量壓縮文件(夾)
     *
     * @param resFileList 要壓縮的文件(夾)列表
     * @param zipFile 生成的壓縮文件
     * @throws IOException 當壓縮過程出錯時拋出
     */
    public static void zipFiles(Collection 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 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 解壓縮的目標目錄
     * @param isDelete 
     * @throws IOException 當解壓縮過程出錯時拋出
     */
    public static void upZipFile(File zipFile, String folderPath, boolean isDelete)
    {
    	
    	String strZipName = zipFile.getName();
  		folderPath += "/" + strZipName.substring(0, strZipName.lastIndexOf("."));
    	
        File desDir = new File(folderPath);
        if (!desDir.exists()) 
        {
            desDir.mkdirs();
        }
        ZipFile zf;
		try
		{
			zf = new ZipFile(zipFile);
			 for (Enumeration entries = zf.entries(); entries.hasMoreElements();)
			 {
		            ZipEntry entry = ((ZipEntry)entries.nextElement());
		            if(entry.isDirectory())
		            {
		                String dirstr = entry.getName();
		                dirstr = new String(dirstr.getBytes("8859_1"), "GB2312");
		                File f=new File(dirstr);
		                f.mkdir();
		                continue;
		            }
		            
		            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();
		        }
			 
			 if (isDelete)
			{
				 zipFile.delete();
			}
		} catch (ZipException e)
		{
			e.printStackTrace();
		} catch (IOException e)
		{
			e.printStackTrace();
		}
    }
 
    /**
     * 解壓文件名包含傳入文字的文件
     *
     * @param zipFile 壓縮文件
     * @param folderPath 目標文件夾
     * @param nameContains 傳入的文件匹配名
     * @throws ZipException 壓縮格式有誤時拋出
     * @throws IOException IO錯誤時拋出
     */
    public static ArrayList upZipSelectedFile(File zipFile, String folderPath,
            String nameContains) throws ZipException, IOException {
        ArrayList fileList = new ArrayList();
 
        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 getEntriesNames(File zipFile) throws ZipException, IOException {
        ArrayList entryNames = new ArrayList();
        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();
        }
    }
}

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved