Java zip 解壓縮__Java

來源:互聯網
上載者:User

最近做Android項目需要內建一些資料檔案,使用了zip壓縮以減少資料包的體積,在用戶端就需要去 解壓縮zip檔案。總結了一下網上前輩的資料,寫了一個解壓縮zip 的工具類,以便複用。


ZipUtils.java

package com.example.zip;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工具 * */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();        }    }}



測試類別 Test.java

package com.example.zip;import java.io.File;import java.io.IOException;import java.util.Arrays;import java.util.List;import java.util.zip.ZipException;public class Test {/** * @param args */public static void main(String[] args) {String sourceDirPath = "D:/fbb/test/";String destDirPath = "D:/fbb/ziptest/";String fileName = "test.zip";testUnZip(sourceDirPath, fileName, destDirPath);testZip(sourceDirPath,destDirPath);}/** * 測試 產生Zip包 * @param sourceDirPath * @param destDirPath */private static void testZip(String sourceDirPath, String destDirPath) {File dir = new File(sourceDirPath);String zipFileName = "test.zip";File zipFile = new File(destDirPath+zipFileName);List<File> resFileList = null;if(dir.exists() && dir.isDirectory()){File[] files = dir.listFiles();resFileList = Arrays.asList(files);}try {ZipUtils.zipFiles(resFileList, zipFile);System.out.println("zip success");} catch (IOException e) {e.printStackTrace();}}/** * 測試 解壓 Zip包 * @param sourceDirPath * @param fileName * @param destDirPath */private static void testUnZip(String sourceDirPath, String fileName,String destDirPath) {File zipFile = new File(sourceDirPath + fileName);try {ZipUtils.upZipFile(zipFile, destDirPath);System.out.println("unzip success");} catch (ZipException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}}







相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.