Перейти к основному содержимому

Как создавать защищенные паролем ZIP-файлы и распаковывать их в Java

· 3 мин. чтения

1. Обзор

В предыдущем уроке мы показали, как архивировать и распаковывать в Java с помощью пакета java.util.zip . Но у нас нет стандартной библиотеки Java для создания защищенных паролем zip-файлов.

В этом руководстве мы узнаем, как создавать защищенные паролем zip-файлы и распаковывать их с помощью библиотеки Zip4j . Это наиболее полная библиотека Java для zip-файлов.

2. Зависимости

Начнем с добавления зависимости zip4j в наш файл pom.xml :

<dependency>
<groupId>net.lingala.zip4j</groupId>
<artifactId>zip4j</artifactId>
<version>2.9.0</version>
</dependency>

3. Заархивируйте файл

Во- первых, мы воспользуемся методом ZipFile addFile() , чтобы заархивировать файл с именем aFile.txt в защищенный паролем архив с именем compress.zip :

ZipParameters zipParameters = new ZipParameters();
zipParameters.setEncryptFiles(true);
zipParameters.setCompressionLevel(CompressionLevel.HIGHER);
zipParameters.setEncryptionMethod(EncryptionMethod.AES);

ZipFile zipFile = new ZipFile("compressed.zip", "password".toCharArray());
zipFile.addFile(new File("aFile.txt"), zipParameters);

Строка setCompressionLevel является необязательной. Мы можем выбрать уровень от САМОГО БЫСТРОГО до УЛЬТРА (по умолчанию НОРМАЛЬНЫЙ ).

В этом примере мы использовали шифрование AES. Если мы хотим использовать стандартное шифрование Zip, мы просто заменяем AES на ZIP_STANDARD .

Обратите внимание, что если файл «aFile.txt» не существует на диске, метод выдаст исключение: «net.lingala.zip4j.exception.ZipException: файл не существует: …»

Чтобы исправить это, мы должны убедиться, что файл либо создан вручную и помещен в папку проекта, либо мы должны создать его из Java:

File fileToAdd = new File("aFile.txt");
if (!fileToAdd.exists()) {
fileToAdd.createNewFile();
}

Кроме того, после того, как мы закончим с новым ZipFile , рекомендуется закрыть ресурс:

zipFile.close();

4. Заархивируйте несколько файлов

Давайте немного изменим код, чтобы мы могли сжимать сразу несколько файлов:

ZipParameters zipParameters = new ZipParameters();
zipParameters.setEncryptFiles(true);
zipParameters.setEncryptionMethod(EncryptionMethod.AES);

List<File> filesToAdd = Arrays.asList(
new File("aFile.txt"),
new File("bFile.txt")
);

ZipFile zipFile = new ZipFile("compressed.zip", "password".toCharArray());
zipFile.addFiles(filesToAdd, zipParameters);

Вместо использования метода addFile мы используем addFiles() и передаем список файлов.

5. Заархивируйте каталог

Мы можем заархивировать папку, просто заменив метод addFile на addFolder :

ZipFile zipFile = new ZipFile("compressed.zip", "password".toCharArray());
zipFile.addFolder(new File("/users/folder_to_add"), zipParameters);

6. Создание разделенного ZIP-файла

Мы можем разделить zip-файл на несколько файлов, когда размер превышает определенный предел , используя методы createSplitZipFile и createSplitZipFileFromFolder :

ZipFile zipFile = new ZipFile("compressed.zip", "password".toCharArray());
int splitLength = 1024 * 1024 * 10; //10MB
zipFile.createSplitZipFile(Arrays.asList(new File("aFile.txt")), zipParameters, true, splitLength);
zipFile.createSplitZipFileFromFolder(new File("/users/folder_to_add"), zipParameters, true, splitLength);

Единицей измерения splitLength являются байты.

7. Извлечение всех файлов

Извлечение файлов так же просто. Мы можем извлечь все файлы из нашего сжатого.zip с помощью метода extractAll() :

ZipFile zipFile = new ZipFile("compressed.zip", "password".toCharArray());
zipFile.extractAll("/destination_directory");

8. Извлечение одного файла

И если мы просто хотим извлечь один файл из сжатого.zip , мы можем использовать метод extractFile() :

ZipFile zipFile = new ZipFile("compressed.zip", "password".toCharArray());
zipFile.extractFile("aFile.txt", "/destination_directory");

9. Заключение

Таким образом, мы научились создавать защищенные паролем zip-файлы и распаковывать их на Java с помощью библиотеки Zip4j.

Реализацию этих примеров можно найти на GitHub .