在Java中处理ZIP/归档:java.util.zip和Zip4j
\n\n数据压缩和归档是Java应用程序开发中的关键任务之一。ZIP归档广泛用于文件打包、网络数据传输和节省磁盘空间。在本文中,我们将详细探讨在Java中处理ZIP归档的两种主要方法:内置包java.util.zip和强大的第三方库Zip4j。
标准包 java.util.zip
\n\n从JDK 1.1开始,Java就提供了java.util.zip包,其中包含用于处理ZIP格式的基本类。主要类包括:
- \n
ZipOutputStream— 用于创建ZIP归档 \n ZipInputStream— 用于读取ZIP归档 \n ZipEntry— 表示归档中的单个条目(文件或文件夹) \n ZipFile— 用于随机访问归档内容 \n
使用 java.util.zip 创建ZIP归档
\n\nimport 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\nimport 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\njava.util.zip 的局限性:
\n- \n
- 不支持加密(密码保护) \n
- 对文件名中的Unicode支持有限(Java 7之前) \n
- 不支持大于4GB的ZIP64归档(Java 8之前) \n
- 处理嵌套文件夹较为复杂 \n
Zip4j库 — 扩展功能
\n\nZip4j 是一个流行的开源第三方库,解决了标准包的大部分局限性。要使用它,请在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\nimport net.lingala.zip4j.ZipFile;\nimport net.lingala.zip4j.model.ZipParam