Java的Zip壓縮幫助類
阿新 • • 發佈:2021-11-09
1 Java的Zip壓縮幫助類 簡介
結合網上的博主的相關文章,提取內容匯聚到此,以此幫助更多需要的人。
提供以下功能
- zip的單檔案壓縮
- 多檔案壓縮
- 資料夾壓縮
- zip壓縮包解壓等方法。
/** * @author zt */ public class ZipCompressor { static final int BUFFER = 8192; private File zipFile; public ZipCompressor(String pathName) { zipFile = new File(pathName); } public void compress(String... pathName) { ZipOutputStream out = null; try { FileOutputStream fileOutputStream = new FileOutputStream(zipFile); CheckedOutputStream cos = new CheckedOutputStream(fileOutputStream, new CRC32()); out = new ZipOutputStream(cos); String basedir = ""; for (int i=0;i<pathName.length;i++){ compress(new File(pathName[i]), out, basedir); } out.close(); } catch (Exception e) { throw new RuntimeException(e); } } public void compress(String srcPathName) { File file = new File(srcPathName); if (!file.exists()) { throw new RuntimeException(srcPathName + "不存在!"); } try { FileOutputStream fileOutputStream = new FileOutputStream(zipFile); CheckedOutputStream cos = new CheckedOutputStream(fileOutputStream, new CRC32()); ZipOutputStream out = new ZipOutputStream(cos); String basedir = ""; compress(file, out, basedir); out.close(); } catch (Exception e) { throw new RuntimeException(e); } } private void compress(File file, ZipOutputStream out, String basedir) { /* 判斷是目錄還是檔案 */ if (file.isDirectory()) { System.out.println("壓縮:" + basedir + file.getName()); this.compressDirectory(file, out, basedir); } else { System.out.println("壓縮:" + basedir + file.getName()); this.compressFile(file, out, basedir); } } /** 壓縮一個目錄 */ private void compressDirectory(File dir, ZipOutputStream out, String basedir) { if (!dir.exists()) { return; } File[] files = dir.listFiles(); for (int i = 0; i < files.length; i++) { /* 遞迴 */ compress(files[i], out, basedir + dir.getName() + "/"); } } /** 壓縮一個檔案 */ private void compressFile(File file, ZipOutputStream out, String basedir) { if (!file.exists()) { return; } try { BufferedInputStream bis = new BufferedInputStream( new FileInputStream(file)); ZipEntry entry = new ZipEntry(basedir + file.getName()); out.putNextEntry(entry); int count; byte data[] = new byte[BUFFER]; while ((count = bis.read(data, 0, BUFFER)) != -1) { out.write(data, 0, count); } bis.close(); } catch (Exception e) { throw new RuntimeException(e); } } public static void unZip(File srcFile, String destDirPath) throws RuntimeException { long start = System.currentTimeMillis(); // 判斷原始檔是否存在 if (!srcFile.exists()) { throw new RuntimeException(srcFile.getPath() + "所指檔案不存在"); } // 開始解壓 ZipFile zipFile = null; try { zipFile = new ZipFile(srcFile, Charset.forName("gbk")); Enumeration<?> entries = zipFile.entries(); while (entries.hasMoreElements()) { ZipEntry entry = (ZipEntry) entries.nextElement(); System.out.println("解壓" + entry.getName()); // 如果是資料夾,就建立個資料夾 if (entry.isDirectory()) { String dirPath = destDirPath + "/" + entry.getName(); File dir = new File(dirPath); dir.mkdirs(); } else { // 如果是檔案,就先建立一個檔案,然後用io流把內容copy過去 File targetFile = new File(destDirPath + "/" + entry.getName()); // 保證這個檔案的父資料夾必須要存在 if (!targetFile.getParentFile().exists()) { targetFile.getParentFile().mkdirs(); } targetFile.createNewFile(); // 將壓縮檔案內容寫入到這個檔案中 InputStream is = zipFile.getInputStream(entry); FileOutputStream fos = new FileOutputStream(targetFile); int len; byte[] buf = new byte[1024]; while ((len = is.read(buf)) != -1) { fos.write(buf, 0, len); } // 關流順序,先開啟的後關閉 fos.close(); is.close(); } } long end = System.currentTimeMillis(); System.out.println("解壓完成,耗時:" + (end - start) + " ms"); } catch (Exception e) { throw new RuntimeException("unzip error from ZipUtils", e); } finally { if (zipFile != null) { try { zipFile.close(); } catch (IOException e) { e.printStackTrace(); } } } } }