Java中ZIP归档操作:java.util.zip完全指南

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

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

开始课程

Java中ZIP归档操作:java.util.zip完全指南



数据归档是软件开发中的基本任务之一。Java提供了强大且灵活的工具包,用于“开箱即用”地处理ZIP归档——即java.util.zip包。在本文中,我们将详细讲解如何使用标准Java工具创建、解压和修改ZIP归档。



java.util.zip包的主要类

java.util.zip包包含用于处理归档的关键类:

  • ZipOutputStream — 用于创建ZIP归档(向归档中写入文件)
  • ZipInputStream — 用于读取和解压ZIP归档
  • ZipEntry — 表示归档中的单个条目(文件/目录)
  • ZipFile — 用于直接访问归档内容,无需完全解压
  • CheckedOutputStream / CheckedInputStream — 用于检查数据完整性(CRC32, Adler32)


创建ZIP归档(ZipOutputStream)

要创建归档,使用ZipOutputStream,它包装了普通的FileOutputStream。每个添加的文件都由一个ZipEntry对象表示。



import java.io.*;import java.util.zip.*;

public class CreateZip { public static void main(String[] args) throws IOException { String[] sourceFiles = {"file1.txt", "file2.txt", "image.png"}; String zipName = "archive.zip";

try (ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zipName))) { byte[] buffer = new byte[1024];

for (String filePath : sourceFiles) { File file = new File(filePath); FileInputStream fis = new FileInputStream(file);

// 在归档中创建条目 ZipEntry zipEntry = new ZipEntry(file.getName()); zos.putNextEntry(zipEntry);

// 写入文件内容 int length; while ((length = fis.read(buffer)) > 0) { zos.write(buffer, 0, length); } zos.closeEntry(); fis.close(); System.out.println("已添加: " + file.getName()); } } System.out.println("归档已创建: " + zipName); }}


创建归档时的重要注意事项:

  • 在写入数据之前始终调用putNextEntry(),并在之后调用closeEntry()
  • 要添加空目录,请使用ZipEntry(name + "/") — 名称必须以“/”结尾
  • 使用try-with-resources自动关闭流


解压ZIP归档(ZipInputStream)

要提取归档中的文件,使用ZipInputStream。读取是顺序进行的——逐个条目读取。



import java.io.*;import java.util.zip.*;

public class ExtractZip { public static void main(String[] args) throws IOException { String zipFile = "archive.zip"; String outputDir = "extracted";

File dir = new File(outputDir); if (!dir.exists()) dir.mkdirs();

try (ZipInputStream zis = new ZipInputStream(new FileInputStream(zipFile))) { ZipEntry entry; byte[] buffer = new byte[1024];

while ((entry = zis.getNextEntry()) != null) { String fileName = entry.getName(); File newFile = new File(outputDir + File.separator + fileName);

// 创建父目录 new File(newFile.getParent()).mkdirs();

// 写入文件 FileOutputStream fos = new FileOutputStream(newFile); int length;

推荐