Java實現(xiàn)的zip壓縮及解壓縮工具類示例
更新時間:2018年01月12日 09:49:54 作者:soundfly
這篇文章主要介紹了Java實現(xiàn)的zip壓縮及解壓縮工具類,結(jié)合實例形式分析了java對文件的進(jìn)行zip壓縮及解壓縮的具體操作技巧,需要的朋友可以參考下
本文實例講述了Java實現(xiàn)的zip壓縮及解壓縮工具類。分享給大家供大家參考,具體如下:
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.util.Enumeration; import org.apache.tools.zip.ZipEntry; import org.apache.tools.zip.ZipFile; import org.apache.tools.zip.ZipOutputStream; public class ZipUtil { private static final int BUFFEREDSIZE = 1024; /** * 壓縮文件 * * @param zipFileName * 保存的壓縮包文件路徑 * @param filePath * 需要壓縮的文件夾或者文件路徑 * @param isDelete * 是否刪除源文件 * @throws Exception */ public void zip(String zipFileName, String filePath, boolean isDelete) throws Exception { zip(zipFileName, new File(filePath), isDelete); } /** * 壓縮文件 * * @param zipFileName * 保存的壓縮包文件路徑 * @param inputFile * 需要壓縮的文件夾或者文件 * @param isDelete * 是否刪除源文件 * @throws Exception */ public void zip(String zipFileName, File inputFile, boolean isDelete) throws Exception { ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipFileName)); if (!inputFile.exists()) { throw new FileNotFoundException("在指定路徑未找到需要壓縮的文件!"); } zip(out, inputFile, "", isDelete); out.close(); } /** * 遞歸壓縮方法 * * @param out * 壓縮包輸出流 * @param f * 需要壓縮的文件 * @param base * 壓縮的路徑 * @param isDelete * 是否刪除源文件 * @throws Exception */ private void zip(ZipOutputStream out, File inputFile, String base, boolean isDelete) throws Exception { if (inputFile.isDirectory()) { // 如果是目錄 File[] inputFiles = inputFile.listFiles(); out.putNextEntry(new ZipEntry(base + "/")); base = base.length() == 0 ? "" : base + "/"; for (int i = 0; i < inputFiles.length; i++) { zip(out, inputFiles[i], base + inputFiles[i].getName(), isDelete); } } else { // 如果是文件 if (base.length() > 0) { out.putNextEntry(new ZipEntry(base)); } else { out.putNextEntry(new ZipEntry(inputFile.getName())); } FileInputStream in = new FileInputStream(inputFile); try { int len; byte[] buff = new byte[BUFFEREDSIZE]; while ((len = in.read(buff)) != -1) { out.write(buff, 0, len); } } catch (IOException e) { throw e; } finally { in.close(); } } if (isDelete) { inputFile.delete(); } } /** * 解壓縮 * * @param zipFilePath * 壓縮包路徑 * @param fileSavePath * 解壓路徑 * @param isDelete * 是否刪除源文件 * @throws Exception */ public void unZip(String zipFilePath, String fileSavePath, boolean isDelete) throws Exception { try { (new File(fileSavePath)).mkdirs(); File f = new File(zipFilePath); if ((!f.exists()) && (f.length() <= 0)) { throw new Exception("要解壓的文件不存在!"); } ZipFile zipFile = new ZipFile(f); String strPath, gbkPath, strtemp; File tempFile = new File(fileSavePath);// 從當(dāng)前目錄開始 strPath = tempFile.getAbsolutePath();// 輸出的絕對位置 Enumeration<ZipEntry> e = zipFile.getEntries(); while (e.hasMoreElements()) { org.apache.tools.zip.ZipEntry zipEnt = e.nextElement(); gbkPath = zipEnt.getName(); if (zipEnt.isDirectory()) { strtemp = strPath + File.separator + gbkPath; File dir = new File(strtemp); dir.mkdirs(); continue; } else { // 讀寫文件 InputStream is = zipFile.getInputStream(zipEnt); BufferedInputStream bis = new BufferedInputStream(is); gbkPath = zipEnt.getName(); strtemp = strPath + File.separator + gbkPath; // 建目錄 String strsubdir = gbkPath; for (int i = 0; i < strsubdir.length(); i++) { if (strsubdir.substring(i, i + 1).equalsIgnoreCase("/")) { String temp = strPath + File.separator + strsubdir.substring(0, i); File subdir = new File(temp); if (!subdir.exists()) subdir.mkdir(); } } FileOutputStream fos = new FileOutputStream(strtemp); BufferedOutputStream bos = new BufferedOutputStream(fos); int len; byte[] buff = new byte[BUFFEREDSIZE]; while ((len = bis.read(buff)) != -1) { bos.write(buff, 0, len); } bos.close(); fos.close(); } } } catch (Exception e) { e.printStackTrace(); throw e; } if (isDelete) { new File(zipFilePath).delete(); } } // public static void main(String[] args) { // ZipUtil cpr = new ZipUtil(); // try { // cpr.zip("C:/Users/Lenovo User/Desktop/test中文.zip", "C:/Users/Lenovo User/Desktop/新建文件夾", false); // cpr.unZip("C:/Users/Lenovo User/Desktop/test中文.zip", "C:/Users/Lenovo User/Desktop/新建文件夾2", false); // } catch (Exception e) { // e.printStackTrace(); // } // // } }
更多關(guān)于java算法相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java文件與目錄操作技巧匯總》、《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點技巧總結(jié)》和《Java緩存操作技巧匯總》
希望本文所述對大家java程序設(shè)計有所幫助。
相關(guān)文章
idea?maven依賴引入失效無法正常導(dǎo)入依賴問題的解決方法
有時候idea導(dǎo)入一個新項目,或者pom文件修改(新增)了依賴,pom文件和代碼會報紅,提示依賴包不存在,下面這篇文章主要給大家介紹了關(guān)于idea?maven依賴引入失效無法正常導(dǎo)入依賴問題的解決方法,需要的朋友可以參考下2023-04-04mybatisplus中EntityWrapper的常用方法
這篇文章主要介紹了mybatisplus中EntityWrapper的常用方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03Spring Security實現(xiàn)登錄認(rèn)證實戰(zhàn)教程
這篇文章主要介紹了Spring Security實現(xiàn)登錄認(rèn)證實戰(zhàn)教程,本文通過示例代碼給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧2024-06-06