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

Java 利用 java.util.zip 實現 ZIP 檔案的壓縮與解壓縮

     編輯:Java 相關知識

前言

在 Java 開發中,處理 ZIP 壓縮檔是常見需求。標準庫 java.util.zip 提供了完整的 API,讓我們能輕鬆建立、讀取 ZIP 檔案。本文分享一個封裝良好的工具類,採用遞歸方式處理目錄結構,支援多層嵌套資料夾,並附上完整原始碼與使用範例。

核心類別設計

TestZip 類別提供四個主要公共方法:

  • zip(String zipFileName, String inputFile):以路徑字串指定壓縮來源
  • zip(String zipFileName, File inputFile):以 File 物件指定來源
  • unzip(String zipFileName, String outputDirectory):解壓縮至指定目錄
  • zip(ZipOutputStream out, File f, String base):遞歸處理核心邏輯(私有)

壓縮實作細節

壓縮流程:

  1. 建立 ZipOutputStream 包裝 FileOutputStream
  2. 呼叫遞歸方法 zip(out, inputFile, "")
  3. 遞歸方法中判斷 File 是目錄還是檔案:
    • 目錄:建立目錄項目(以 / 結尾),遍歷子檔案遞歸處理
    • 檔案:建立檔案項目,以 FileInputStream 讀取內容寫入 ZIP
  4. 最後關閉輸出流

解壓縮實作細節

解壓縮流程:

  1. 建立 ZipInputStream 讀取 ZIP 檔
  2. 迴圈呼叫 getNextEntry() 取得每個 ZipEntry
  3. 判斷項目類型:
    • 目錄:在輸出目錄建立對應資料夾
    • 檔案:建立檔案,逐位元組讀取寫入
  4. 關閉輸入流

完整原始碼

/**
 * TestZip.java
 * coding by Serol Luo.
 * rollingpig@163.com
 * 2003/07/03
 * https://www.chinaunix.net/forum/viewforum.php?f=26
 * 轉載請保留此信息
 */
import java.util.*;
import java.util.zip.*;
import java.io.*;

class TestZip {
    public void zip(String zipFileName, String inputFile) throws Exception {
        zip(zipFileName, new File(inputFile));
    }

    public void zip(String zipFileName, File inputFile) throws Exception {
        ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipFileName));
        zip(out, inputFile, "");
        System.out.println("zip done");
        out.close();
    }

    public void unzip(String zipFileName, String outputDirectory) throws Exception {
        ZipInputStream in = new ZipInputStream(new FileInputStream(zipFileName));
        ZipEntry z;
        while ((z = in.getNextEntry()) != null) {
            System.out.println("unziping " + z.getName());
            if (z.isDirectory()) {
                String name = z.getName();
                name = name.substring(0, name.length() - 1);
                File f = new File(outputDirectory + File.separator + name);
                f.mkdir();
                System.out.println("mkdir " + outputDirectory + File.separator + name);
            } else {
                File f = new File(outputDirectory + File.separator + z.getName());
                f.createNewFile();
                FileOutputStream out = new FileOutputStream(f);
                int b;
                while ((b = in.read()) != -1)
                    out.write(b);
                out.close();
            }
        }
        in.close();
    }

    public void zip(ZipOutputStream out, File f, String base) throws Exception {
        System.out.println("Zipping " + f.getName());
        if (f.isDirectory()) {
            File[] fl = f.listFiles();
            out.putNextEntry(new ZipEntry(base + "/"));
            base = base.length() == 0 ? "" : base + "/";
            for (int i = 0; i < fl.length; i++) {
                zip(out, fl[i], base + fl[i].getName());
            }
        } else {
            out.putNextEntry(new ZipEntry(base));
            FileInputStream in = new FileInputStream(f);
            int b;
            while ((b = in.read()) != -1)
                out.write(b);
            in.close();
        }
    }

    public static void main(String[] args) {
        try {
            TestZip t = new TestZip();
            t.zip("c:\\test.zip", "c:\\test");
            t.unzip("c:\\test.zip", "c:\\test2");
        } catch (Exception e) {
            e.printStackTrace(System.out);
        }
    }
}

使用範例

TestZip zipTool = new TestZip();
// 壓縮單一檔案或整個目錄
zipTool.zip("D:/archive.zip", "D:/source_folder");
// 解壓縮
zipTool.unzip("D:/archive.zip", "D:/extracted");

注意事項

  • 原始碼使用逐位元組讀寫(read()/write(int)),大檔案建議改用緩衝區(byte[] buffer)提升效能
  • 路徑分隔符使用 File.separator 確保跨平台相容
  • 解壓縮時未處理檔案覆蓋邏輯,實際專案請自行加入檢查
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved