Java Top

Get started with Spring 5 and Spring Boot 2, through the Learn Spring course:

>> CHECK OUT THE COURSE

1. Overview

In a previous tutorial, we show how to zip and unzip in Java with the help of the java.util.zip package. But we don’t have any standard Java library to create password-protected zip files.

In this tutorial, we'll learn how to create password-protected zip files and unzip them with the Zip4j library. It's the most comprehensive Java library for zip files.

2. Dependencies

Let's start by adding the zip4j dependency to our pom.xml file:

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

3. Zip a File

First, we'll use the ZipFile addFile() method to zip a file named aFile.txt into a password-protected archive named compressed.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"));

The setCompressionLevel line is optional. We can choose from level FASTEST to ULTRA (the default is NORMAL).

In this example, we've used AES encryption. If we want to use Zip standard encryption, we just replace AES with ZIP_STANDARD.

Note that if the file “aFile.txt” doesn't exist on disk, the method will throw an exception: “net.lingala.zip4j.exception.ZipException: File does not exist: …”

To fix this, we have to make sure the file is either created manually and placed in the project folder, or we have to create it from Java:

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

Also, after we're done with the new ZipFile, it's a good practice to close the resource:

zipFile.close();

4. Zip Multiple Files

Let's modify the code a bit so that we can compress multiple files at once:

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);

Instead of using the addFile method, we use addFiles() and pass in a List of files.

5. Zip a Directory

We can zip a folder simply by replacing the addFile method with addFolder:

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

6. Creating a Split Zip File

We can split the zip file over several files when the size exceeds a particular limit by using createSplitZipFile and createSplitZipFileFromFolder methods:

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);

The unit of splitLength is bytes.

7. Extracting All Files

Extracting files is just as simple. We can extract all files from our compressed.zip with the extractAll() method:

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

8. Extracting a Single File

And if we just want to extract a single file from compressed.zip, we can use the extractFile() method:

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

9. Conclusion

In summary, we've learned how to create password-protected zip files and unzip them in Java with the Zip4j library.

The implementation of these examples can be found over on GitHub.

Java bottom

Get started with Spring 5 and Spring Boot 2, through the Learn Spring course:

>> CHECK OUT THE COURSE
Junit footer banner
2 Comments
Oldest
Newest
Inline Feedbacks
View all comments
Comments are closed on this article!