天天看點

zip壓縮解決檔案名中文亂碼問題(2)

使用apache旗下的commons-compress 壓縮和解壓zip檔案

可以參考我的前一篇部落格:http://hw1287789687.iteye.com/blog/1976309

以下是我封裝的一個工具類,專門負責zip的壓縮和解壓 

compressziputil:

zip壓縮解決檔案名中文亂碼問題(2)

package com.common.util;  

import java.io.file;  

import java.io.fileinputstream;  

import java.io.fileoutputstream;  

import java.io.ioexception;  

import java.util.arraylist;  

import java.util.list;  

import org.apache.commons.compress.archivers.archiveexception;  

import org.apache.commons.compress.archivers.archiveinputstream;  

import org.apache.commons.compress.archivers.archiveoutputstream;  

import org.apache.commons.compress.archivers.archivestreamfactory;  

import org.apache.commons.compress.archivers.zip.ziparchiveentry;  

import org.apache.commons.compress.archivers.zip.ziparchiveinputstream;  

import org.apache.commons.compress.archivers.zip.ziparchiveoutputstream;  

import com.io.hw.file.util.fileutils;  

import com.string.widget.util.valuewidget;  

import com.swing.messagebox.guiutil23;  

/*** 

 * use apache 

 * commons-compress,http://www.cnblogs.com/un4sure/archive/2011/09/27/ 

 * 2193298.html,http://hw1287789687.iteye.com/blog/1976309 

 *  

 * @author huangwei 

 * @since 2013-11-18 

 */  

public final class compressziputil {  

    private compressziputil() {  

        throw new error("don't let anyone instantiate this class.");  

    }  

    /*** 

     *  

     * @param zipout 

     * @param filepath 

     *            :要壓縮的單個檔案 

     * @throws ioexception 

     */  

    public static void addentry(ziparchiveoutputstream zipout, string filepath)  

            throws ioexception {  

        file singlefile = new file(filepath);  

        if (singlefile.isdirectory()) {  

            return;  

        }  

        ziparchiveentry zipentry2 = new ziparchiveentry(singlefile,  

                systemutil.getfilesimplename(filepath));  

        zipout.putarchiveentry(zipentry2);  

        fileinputstream fin = new fileinputstream(filepath);  

        // 不要關閉zipout,關閉之前要執行closearchiveentry()  

        fileutils.writein2output(fin, zipout, false, true);  

     *            : 要壓縮的單個檔案 

    public static void addentry(ziparchiveoutputstream zipout, file filepath)  

        if (filepath.isdirectory()) {  

        ziparchiveentry zipentry2 = new ziparchiveentry(filepath,  

                filepath.getname());  

     * @param filepaths 

     *            :要壓縮的檔案 

    public static void compresszip(ziparchiveoutputstream zipout,  

            @suppresswarnings("rawtypes") list filepaths) throws ioexception {  

        for (object fileobj : filepaths) {  

            if (fileobj instanceof file) {  

                file file = (file) fileobj;  

                addentry(zipout, file);  

            } else {  

                addentry(zipout, (string) fileobj);  

            }  

        zipout.closearchiveentry();  

        zipout.flush();  

        zipout.finish();  

        zipout.close();  

     * 壓縮. 

     * @param zipfile 

     *            :壓縮的結果--zip檔案 

     * @throws archiveexception 

    public static void compresszip(file zipfile,  

            @suppresswarnings("rawtypes") list filepaths) throws ioexception,  

            archiveexception {  

        fileoutputstream fou = new fileoutputstream(zipfile);  

        archiveoutputstream archouts = new archivestreamfactory()  

                .createarchiveoutputstream(archivestreamfactory.zip, fou);  

        if (archouts instanceof ziparchiveoutputstream) {  

            ziparchiveoutputstream zipout = (ziparchiveoutputstream) archouts;  

            compresszip(zipout, filepaths);  

    public static void compresszip(string zipfile,  

        compresszip(new file(zipfile), filepaths);  

     * compress single file. 

     *            :single file 

    public static void compresssingefile(string zipfile, string filepath)  

            throws ioexception, archiveexception {  

        list filepaths = new arraylist();  

        filepaths.add(filepath);  

        compresszip(zipfile, filepaths);  

    public static void compresssingefile(string zipfile, file filepath)  

     * 壓縮指定檔案夾中的所有檔案. 

     * @param folderpaths 

    public static void compresszip(string zipfile, string folderpaths)  

        list list = fileutils.getlistfiles(new file(folderpaths));  

        compresszip(zipfile, list);  

    public static void compresszip(string zipfile, file folderpaths)  

        list list = fileutils.getlistfiles(folderpaths);  

     * 解壓zip 

     * @param decompressloc 

     *            :解壓之後的檔案所在目錄 

    public static boolean decompress(string zipfile, file decompressloc)  

            throws archiveexception, ioexception {  

        fileinputstream fin = new fileinputstream(zipfile);  

        archiveinputstream archouts = new archivestreamfactory()  

                .createarchiveinputstream(archivestreamfactory.zip, fin);  

        ziparchiveinputstream zipin = (ziparchiveinputstream) archouts;  

        ziparchiveentry zipentry;  

        while (!valuewidget.isnullorempty(zipentry = zipin.getnextzipentry())) {  

            string filename = zipentry.getname();  

            file singfile = new file(decompressloc, filename);  

            if (singfile.exists()) {//若解壓後的檔案已經存在,則直接退出  

                guiutil23.warningdialog("file \"" + singfile.getabsolutepath()  

                        + "\" does  exist.");  

                zipin.close();  

//              break;  

                return false;  

            system.out.println(filename);  

            fileutils.writein2output(zipin, new fileoutputstream(singfile),  

                    true, false);  

        zipin.close();  

        return true;  

    public static boolean decompress(string zipfile, string decompresslocstr)  

        file decompressloc = new file(decompresslocstr);  

        return decompress(zipfile, decompressloc);  

}  

 附件:

(1)依賴的jar包 io0007-find_progess(包含源碼)

(2)例子:目前隻能壓縮和解壓一級目錄的zip檔案,zip_mgmt-0.0.1-snapshot.jar

zip壓縮解決檔案名中文亂碼問題(2)