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;