在 Java 中,你可以使用不同的方式来进行 ZIP 压缩和解压缩操作。下面我将介绍几种常用的实现方式,包括使用 Java 标准库以及一些流行的第三方库。对于每种方式,我会提供步骤流程和相应的示例代码。
Java 标准库提供了 java.util.zip
包来进行 ZIP 压缩和解压缩操作。以下是基本的步骤:
步骤流程:
ZipOutputStream
实例,用于将数据写入 ZIP 文件。putNextEntry
方法将文件或目录添加到 ZIP 文件中。write
方法将数据写入 ZIP 文件。closeEntry
方法关闭当前条目。ZipOutputStream
。示例代码:
import java.io.*;
import java.util.zip.*;
public class ZipExample {
public static void main(String[] args) throws IOException {
String sourceDirectory = "/path/to/source/directory";
String zipFilePath = "/path/to/output/file.zip";
try (ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(zipFilePath))) {
File sourceDir = new File(sourceDirectory);
zipDirectory(sourceDir, sourceDir.getName(), zipOut);
}
}
private static void zipDirectory(File directory, String parentPath, ZipOutputStream zipOut) throws IOException {
File[] files = directory.listFiles();
byte[] buffer = new byte[4096];
for (File file : files) {
if (file.isDirectory()) {
zipDirectory(file, parentPath + "/" + file.getName(), zipOut);
continue;
}
try (FileInputStream fis = new FileInputStream(file)) {
ZipEntry zipEntry = new ZipEntry(parentPath + "/" + file.getName());
zipOut.putNextEntry(zipEntry);
int length;
while ((length = fis.read(buffer)) > 0) {
zipOut.write(buffer, 0, length);
}
zipOut.closeEntry();
}
}
}
}
无需额外依赖,Java 标准库已包含 java.util.zip
。
Apache Commons Compress 是一个流行的第三方库,提供了更灵活的 ZIP 处理功能。
步骤流程:
ZipArchiveOutputStream
来创建 ZIP 文件,并使用 ArchiveEntry
来表示 ZIP 条目。putArchiveEntry
方法添加条目,使用 write
方法写入数据。closeArchiveEntry
方法关闭条目。ZipArchiveOutputStream
。示例代码:
Maven 依赖:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-compress</artifactId>
<version>1.21</version>
</dependency>
Gradle 依赖:
implementation 'org.apache.commons:commons-compress:1.21'
示例代码:
import org.apache.commons.compress.archivers.zip.*;
import org.apache.commons.compress.utils.IOUtils;
import java.io.*;
import java.nio.file.*;
public class CommonsCompressExample {
public static void main(String[] args) throws IOException {
String sourceDirectory = "/path/to/source/directory";
String zipFilePath = "/path/to/output/file.zip";
try (ZipArchiveOutputStream zipOut = new ZipArchiveOutputStream(new FileOutputStream(zipFilePath))) {
zipDirectory(sourceDirectory, "", zipOut);
}
}
private static void zipDirectory(String sourceDir, String parentPath, ZipArchiveOutputStream zipOut) throws IOException {
File directory = new File(sourceDir);
File[] files = directory.listFiles();
for (File file : files) {
if (file.isDirectory()) {
zipDirectory(file.getAbsolutePath(), parentPath + file.getName() + "/", zipOut);
continue;
}
try (InputStream fis = new FileInputStream(file)) {
String entryName = parentPath + file.getName();
ZipArchiveEntry entry = new ZipArchiveEntry(entryName);
zipOut.putArchiveEntry(entry);
IOUtils.copy(fis, zipOut);
zipOut.closeArchiveEntry();
}
}
}
}
以上是两种常用的 Java ZIP 编码实现方式。你可以根据自己的项目需求和偏好选择其中之一。记得替换示例代码中的路径为你自己的路径。