首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 壓縮解壓實戰:ZIP、JAR、GZIP 完整代碼範例

     編輯:Java 相關知識

核心 API:java.util.zip

Java 原生支援主流壓縮格式,核心類別:

  • ZipOutputStream / ZipInputStream:串流式壓縮/解壓
  • ZipFile:隨機存取 ZIP 檔案
  • ZipEntry:代表壓縮包內單一檔案/目錄條目
  • GZIPOutputStream / GZIPInputStream:單檔 GZIP 壓縮(Linux 常用)
  • JarOutputStream / JarInputStream:JAR 專用(繼承 ZIP,支援 Manifest)

壓縮實作範例

單檔壓縮

try (ZipOutputStream zos = new ZipOutputStream(
        new FileOutputStream("out.zip"), StandardCharsets.UTF_8)) {
    zos.putNextEntry(new ZipEntry("data.txt"));
    Files.copy(Paths.get("data.txt"), zos);
    zos.closeEntry();
}

目錄遞歸壓縮(保留相對路徑)

void zipDir(File dir, ZipOutputStream zos, String parent) throws IOException {
    for (File f : dir.listFiles()) {
        String entryName = parent.isEmpty() ? f.getName() : parent + "/" + f.getName();
        if (f.isDirectory()) {
            zipDir(f, zos, entryName);
        } else {
            zos.putNextEntry(new ZipEntry(entryName));
            Files.copy(f.toPath(), zos);
            zos.closeEntry();
        }
    }
}

解壓實作範例

try (ZipFile zipFile = new ZipFile("in.zip", StandardCharsets.UTF_8);
     ZipInputStream zis = new ZipInputStream(new FileInputStream("in.zip"), StandardCharsets.UTF_8)) {
    ZipEntry entry;
    while ((entry = zis.getNextEntry()) != null) {
        Path target = Paths.get("out", entry.getName());
        if (entry.isDirectory()) {
            Files.createDirectories(target);
        } else {
            Files.createDirectories(target.getParent());
            try (OutputStream os = Files.newOutputStream(target)) {
                zis.transferTo(os); // Java 9+
            }
        }
        zis.closeEntry();
    }
}

關鍵細節與最佳實踐

  1. 編碼指定:建構子傳入 Charset.forName("UTF-8") 或 StandardCharsets.UTF_8,避免中文檔名亂碼
  2. 緩衝區:手動讀寫時使用 8KB+ 緩衝區;Java 9+ 直接 InputStream.transferTo(OutputStream)
  3. 大檔案:Zip64 模式支援 4GB+ 檔案(JDK 7+ 自動啟用)
  4. JAR 特殊性:JarOutputStream 自動寫入 META-INF/MANIFEST.MF;可透過 Manifest 類自訂屬性
  5. GZIP 限制:單檔壓縮,不支援目錄結構;常搭配 Tar 實現 .tar.gz
  6. 資源管理:統一使用 try-with-resources 確保流關閉

效能調優建議

  • 壓縮等級:Deflater.setLevel(Deflater.BEST_COMPRESSION) / BEST_SPEED
  • 並行壓縮:大量檔案可分批次提交至執行緒池
  • 記憶體映射:超大檔案考慮 MappedByteBuffer 減少堆拷貝

掌握 java.util.zip 體系,即可在無第三方依賴下完成企業級壓縮解壓需求。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved