Java壓縮文件夾成Zip文件和解壓縮Zip文件的實現(xiàn)

Java對Zip文件的支持不是很強大斯辰,有一些需要自己實現(xiàn)的代碼,我在網(wǎng)上找了很多代碼坡疼,都不能用于生產(chǎn)彬呻,要不就是流沒有被關(guān)閉,要不就是Exception處理很隨意回梧,下面是我修改過并測試過的代碼能用于生產(chǎn)的壓縮和解壓縮的代碼废岂,做一個代碼備份。

使用遞歸算法將一個文件夾壓縮成Zip文件:

static final int BUFFER = 8192;

public static void compress(String srcPath , String dstPath) throws IOException{
    File srcFile = new File(srcPath);
    File dstFile = new File(dstPath);
    if (!srcFile.exists()) {
        throw new FileNotFoundException(srcPath + "不存在狱意!");
    }

    FileOutputStream out = null;
    ZipOutputStream zipOut = null;
    try {
        out = new FileOutputStream(dstFile);
        CheckedOutputStream cos = new CheckedOutputStream(out,new CRC32());
        zipOut = new ZipOutputStream(cos);
        String baseDir = "";
        compress(srcFile, zipOut, baseDir);
    }
    finally {
        if(null != zipOut){
            zipOut.close();
            out = null;
        }

        if(null != out){
            out.close();
        }
    }
}

private static void compress(File file, ZipOutputStream zipOut, String baseDir) throws IOException{
    if (file.isDirectory()) {
        compressDirectory(file, zipOut, baseDir);
    } else {
        compressFile(file, zipOut, baseDir);
    }
}

/** 壓縮一個目錄 */
private static void compressDirectory(File dir, ZipOutputStream zipOut, String baseDir) throws IOException{
    File[] files = dir.listFiles();
    for (int i = 0; i < files.length; i++) {
        compress(files[i], zipOut, baseDir + dir.getName() + "/");
    }
}

/** 壓縮一個文件 */
private static void compressFile(File file, ZipOutputStream zipOut, String baseDir)  throws IOException{
    if (!file.exists()){
        return;
    }

    BufferedInputStream bis = null;
    try {
        bis = new BufferedInputStream(new FileInputStream(file));
        ZipEntry entry = new ZipEntry(baseDir + file.getName());
        zipOut.putNextEntry(entry);
        int count;
        byte data[] = new byte[BUFFER];
        while ((count = bis.read(data, 0, BUFFER)) != -1) {
            zipOut.write(data, 0, count);
        }

    }finally {
        if(null != bis){
            bis.close();
        }
    }
}

將Zip文件加壓縮出來湖苞,包含所有文件和文件夾到目標目錄:

public static void decompress(String zipFile , String dstPath)throws IOException{
    File pathFile = new File(dstPath);
    if(!pathFile.exists()){
        pathFile.mkdirs();
    }
    ZipFile zip = new ZipFile(zipFile);
    for(Enumeration entries = zip.entries();entries.hasMoreElements();){
        ZipEntry entry = (ZipEntry)entries.nextElement();
        String zipEntryName = entry.getName();
        InputStream in = null;
        OutputStream out = null;
        try{
            in =  zip.getInputStream(entry);
            String outPath = (dstPath+"/"+zipEntryName).replaceAll("\\*", "/");;
            //判斷路徑是否存在,不存在則創(chuàng)建文件路徑
            File file = new File(outPath.substring(0, outPath.lastIndexOf('/')));
            if(!file.exists()){
                file.mkdirs();
            }
            //判斷文件全路徑是否為文件夾,如果是上面已經(jīng)上傳,不需要解壓
            if(new File(outPath).isDirectory()){
                continue;
            }

            out = new FileOutputStream(outPath);
            byte[] buf1 = new byte[1024];
            int len;
            while((len=in.read(buf1))>0){
                out.write(buf1,0,len);
            }
        }
        finally {
            if(null != in){
                in.close();
            }

            if(null != out){
                out.close();
            }
       }
    }
    zip.close();
}

調(diào)用示例:

public static void main(String[] args)throws Exception{
    String targetFolderPath = "/Users/fred/zipFile/zipFolder";
    String rawZipFilePath = "/Users/fred/zipFile/raw.zip";
    String newZipFilePath = "/Users/fred/zipFile/new.zip";

    //將Zip文件解壓縮到目標目錄
    CompressUtil.decompress(rawZipFilePath , targetFolderPath);

    //將目標目錄的文件壓縮成Zip文件
    CompressUtil.compress(targetFolderPath , newZipFilePath);

}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市详囤,隨后出現(xiàn)的幾起案子财骨,更是在濱河造成了極大的恐慌,老刑警劉巖藏姐,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件隆箩,死亡現(xiàn)場離奇詭異,居然都是意外死亡羔杨,警方通過查閱死者的電腦和手機捌臊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來兜材,“玉大人理澎,你說我怎么就攤上這事∈锕眩” “怎么了糠爬?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長举庶。 經(jīng)常有香客問我执隧,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任镀琉,我火速辦了婚禮峦嗤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘滚粟。我一直安慰自己寻仗,他們只是感情好,可當我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布凡壤。 她就那樣靜靜地躺著,像睡著了一般耙替。 火紅的嫁衣襯著肌膚如雪亚侠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天俗扇,我揣著相機與錄音硝烂,去河邊找鬼。 笑死铜幽,一個胖子當著我的面吹牛滞谢,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播除抛,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼狮杨,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了到忽?” 一聲冷哼從身側(cè)響起橄教,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎喘漏,沒想到半個月后护蝶,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡翩迈,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年持灰,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片负饲。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡堤魁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出绽族,到底是詐尸還是另有隱情姨涡,我是刑警寧澤,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布吧慢,位于F島的核電站涛漂,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜匈仗,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一瓢剿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧悠轩,春花似錦间狂、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至何鸡,卻和暖如春队他,著一層夾襖步出監(jiān)牢的瞬間眯搭,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留锚扎,地道東北人沛硅。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓呕臂,卻偏偏與公主長得像朗儒,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子吮炕,可洞房花燭夜當晚...
    茶點故事閱讀 42,925評論 2 344

推薦閱讀更多精彩內(nèi)容