Работа с ZIP/архивами в Java: java.util.zip и Zip4j

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Работа с 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                    

Рекомендаций