Работа с ZIP/архивами в Java: java.util.zip и Zip4j
Сжатие и архивация данных — одна из ключевых задач при разработке приложений на Java. Архивы ZIP широко используются для упаковки файлов, передачи данных по сети и экономии дискового пространства. В этой статье мы подробно рассмотрим два основных подхода к работе с ZIP-архивами на Java: встроенный пакет java.util.zip и мощную стороннюю библиотеку Zip4j.
Стандартный пакет java.util.zip
Начиная с JDK 1.1, в Java доступен пакет java.util.zip, который предоставляет базовые классы для работы с ZIP-форматом. Основные классы:
ZipOutputStream— для создания ZIP-архивовZipInputStream— для чтения ZIP-архивовZipEntry— представляет отдельную запись (файл или папку) внутри архиваZipFile— для случайного доступа к содержимому архива
Создание ZIP-архива с java.util.zip
import java.io.*;
import java.util.zip.*;
public class ZipCreator {
public static void main(String[] args) throws IOException {
String sourceFile = "document.txt";
String zipName = "archive.zip";
try (FileOutputStream fos = new FileOutputStream(zipName);
ZipOutputStream zos = new ZipOutputStream(fos)) {
File fileToZip = new File(sourceFile);
FileInputStream fis = new FileInputStream(fileToZip);
ZipEntry zipEntry = new ZipEntry(fileToZip.getName());
zos.putNextEntry(zipEntry);
byte[] buffer = new byte[1024];
int length;
while ((length = fis.read(buffer)) >= 0) {
zos.write(buffer, 0, length);
}
zos.closeEntry();
fis.close();
}
System.out.println("Архив создан: " + zipName);
}
}
Распаковка ZIP-архива
import java.io.*;
import java.util.zip.*;
public class ZipExtractor {
public static void main(String[] args) throws IOException {
String zipFile = "archive.zip";
String outputDir = "extracted";
new File(outputDir).mkdirs();
try (ZipInputStream zis = new ZipInputStream(new FileInputStream(zipFile))) {
ZipEntry entry;
while ((entry = zis.getNextEntry()) != null) {
File newFile = new File(outputDir, entry.getName());
new File(newFile.getParent()).mkdirs();
FileOutputStream fos = new FileOutputStream(newFile);
byte[] buffer = new byte[1024];
int len;
while ((len = zis.read(buffer)) > 0) {
fos.write(buffer, 0, len);
}
fos.close();
zis.closeEntry();
}
}
System.out.println("Распаковка завершена в папку: " + outputDir);
}
}
Ограничения java.util.zip:
- Нет поддержки шифрования (защиты паролем)
- Ограниченная работа с Unicode в именах файлов (до Java 7)
- Отсутствие поддержки ZIP64 для архивов > 4 ГБ (до Java 8)
- Сложность работы с вложенными папками
Библиотека Zip4j — расширенные возможности
Zip4j — это популярная сторонняя библиотека с открытым исходным кодом, которая решает большинство ограничений стандартного пакета. Для её подключения добавьте зависимость в Maven:
<dependency>
<groupId>net.lingala.zip4j</groupId>
<artifactId>zip4j</artifactId>
<version>2.11.5</version>
</dependency>
Создание зашифрованного ZIP-архива с Zip4j
import net.lingala.zip4j.ZipFile;
import net.lingala.zip4j.model.ZipParameters;
import net.lingala.zip4j.enums.EncryptionMethod;
import java.io.File;
import java.util.Collections;
public class Zip4jEncrypted {
public static void main(String[] args) throws Exception {
String password = "secret123";
ZipFile zipFile = new ZipFile("protected.zip", password.toCharArray());
ZipParameters parameters = new ZipParameters();
parameters.setEncryptFiles(true);
parameters.setEncryptionMethod(EncryptionMethod.AES);
zipFile.addFiles(Collections.singletonList(new File("document.txt")), parameters);
System.out.println("Зашифрованный архив создан!");
}
}
Распаковка с проверкой пароля
import net.lingala.zip4j.ZipFile;
public class Zip4jDecrypt {
public static void main(String[] args) throws Exception {
String password = "secret123";
ZipFile zipFile = new ZipFile("protected.zip", password.toCharArray());
if (zipFile.isEncrypted()) {
zipFile.extractAll("extracted");
System.out.println("Распаковка успешна!");
} else {
System.out.println