在Java中处理ZIP/归档:java.util.zip和Zip4j

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

在Java中处理ZIP/归档:java.util.zip和Zip4j

\n\n

数据压缩和归档是Java应用程序开发中的关键任务之一。ZIP归档广泛用于文件打包、网络数据传输和节省磁盘空间。在本文中,我们将详细探讨在Java中处理ZIP归档的两种主要方法:内置包java.util.zip和强大的第三方库Zip4j。

\n\n

标准包 java.util.zip

\n\n

从JDK 1.1开始,Java就提供了java.util.zip包,其中包含用于处理ZIP格式的基本类。主要类包括:

\n
    \n
  • ZipOutputStream — 用于创建ZIP归档
  • \n
  • ZipInputStream — 用于读取ZIP归档
  • \n
  • ZipEntry — 表示归档中的单个条目(文件或文件夹)
  • \n
  • ZipFile — 用于随机访问归档内容
  • \n
\n\n

使用 java.util.zip 创建ZIP归档

\n\n
import java.io.*;\nimport java.util.zip.*;\n\npublic class ZipCreator {\n    public static void main(String[] args) throws IOException {\n        String sourceFile = "document.txt";\n        String zipName = "archive.zip";\n\n        try (FileOutputStream fos = new FileOutputStream(zipName);\n             ZipOutputStream zos = new ZipOutputStream(fos)) {\n\n            File fileToZip = new File(sourceFile);\n            FileInputStream fis = new FileInputStream(fileToZip);\n\n            ZipEntry zipEntry = new ZipEntry(fileToZip.getName());\n            zos.putNextEntry(zipEntry);\n\n            byte[] buffer = new byte[1024];\n            int length;\n            while ((length = fis.read(buffer)) >= 0) {\n                zos.write(buffer, 0, length);\n            }\n            zos.closeEntry();\n            fis.close();\n        }\n        System.out.println("归档已创建: " + zipName);\n    }\n}
\n\n

解压ZIP归档

\n\n
import java.io.*;\nimport java.util.zip.*;\n\npublic class ZipExtractor {\n    public static void main(String[] args) throws IOException {\n        String zipFile = "archive.zip";\n        String outputDir = "extracted";\n\n        new File(outputDir).mkdirs();\n\n        try (ZipInputStream zis = new ZipInputStream(new FileInputStream(zipFile))) {\n            ZipEntry entry;\n            while ((entry = zis.getNextEntry()) != null) {\n                File newFile = new File(outputDir, entry.getName());\n                new File(newFile.getParent()).mkdirs();\n\n                FileOutputStream fos = new FileOutputStream(newFile);\n                byte[] buffer = new byte[1024];\n                int len;\n                while ((len = zis.read(buffer)) > 0) {\n                    fos.write(buffer, 0, len);\n                }\n                fos.close();\n                zis.closeEntry();\n            }\n        }\n        System.out.println("解压完成到文件夹: " + outputDir);\n    }\n}
\n\n

java.util.zip 的局限性:

\n
    \n
  • 不支持加密(密码保护)
  • \n
  • 对文件名中的Unicode支持有限(Java 7之前)
  • \n
  • 不支持大于4GB的ZIP64归档(Java 8之前)
  • \n
  • 处理嵌套文件夹较为复杂
  • \n
\n\n

Zip4j库 — 扩展功能

\n\n

Zip4j 是一个流行的开源第三方库,解决了标准包的大部分局限性。要使用它,请在Maven中添加依赖:

\n\n
<dependency>\n    <groupId>net.lingala.zip4j</groupId>\n    <artifactId>zip4j</artifactId>\n    <version>2.11.5</version>\n</dependency>
\n\n

使用Zip4j创建加密的ZIP归档

\n\n
import net.lingala.zip4j.ZipFile;\nimport net.lingala.zip4j.model.ZipParam                    

推荐