用Java创建受密码保护的Zip文件

时间:2020-01-09 10:35:25  来源:igfitidea点击:

在文章如何用Java压缩文件以及如何用Java压缩文件夹中,我们已经看到了如何用Java压缩文件和目录。在本文中,我们将介绍如何在Java中创建受密码保护的zip文件以及如何解压缩受密码保护的压缩文件。

Java中受密码保护的zip文件支持

在java.util.zip软件包中,该软件包包括用于压缩和解压缩文件的类,不支持创建受密码保护的zip文件,因此使用Zip4j库来实现此目的。

可以从以下位置下载创建受密码保护的zip文件zip4j_1.3.2.jar所需的jar – http://www.lingala.net/zip4j/download.php。

尽管Zip4j库有点老,并且还有其他可用的选项,但我认为该库仍然是创建受密码保护的zip文件的最佳选择。

受密码保护的zip文件Java示例

此处给出的两个示例涵盖了方案:

  • 如果我们有单独的文件,可以将其添加到文件夹,然后对其进行压缩和密码保护。参见示例。
  • 当我们要压缩目录和密码时,请对其进行保护。参见示例。

在这些示例中,我们还将看到如何解压缩受密码保护的文件。

将文件添加到文件夹并压缩

如果要压缩单独的文件,则将它们添加到ArrayList并将该列表以及用于压缩和加密的参数一起传递,以获取受密码保护的压缩文件。在示例中,unZipPasswordProtectedFiles()方法将受密码保护的压缩文件解压缩。

import java.io.File;
import java.util.ArrayList;
import net.lingala.zip4j.core.ZipFile;
import net.lingala.zip4j.exception.ZipException;
import net.lingala.zip4j.model.ZipParameters;
import net.lingala.zip4j.util.Zip4jConstants;

public class PwdZipFiles {

  public static void main(String[] args) {
    PwdZipFiles pwdZipFiles = new PwdZipFiles();
    String zipFilePath = "F:\ZipTest\Final.zip";
    pwdZipFiles.compressFilesWithPwd(zipFilePath);
    pwdZipFiles.unZipPasswordProtectedFiles(zipFilePath);
  }
	
  public void compressFilesWithPwd(String zipFilePath) {
    // Zipped folder name
    try {
      ZipFile zipFile = new ZipFile(zipFilePath);
      ArrayList<File> filesToAdd = new ArrayList<>();
      // Add files which are to be compressed to the array list
      filesToAdd.add(new File("F:\ZipTest\Shop Implementation.docx"));
      filesToAdd.add(new File("F:\ZipTest\Test.txt"));
      filesToAdd.add(new File("F:\Test\sample.txt"));
			
      // Initiate Zip Parameters 
      ZipParameters parameters = new ZipParameters();
      // set compression method to deflate compression
      parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE); 
      parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);
      parameters.setEncryptFiles(true);
      parameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_AES);
      parameters.setAesKeyStrength(Zip4jConstants.AES_STRENGTH_256);
      // Setting password
      parameters.setPassword("password");	        
      zipFile.addFiles(filesToAdd, parameters);

    } catch (ZipException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }				
  }
	
  public void unZipPasswordProtectedFiles(String zipFilePath){
    // Get unzip file path by removing .zip from the zipped file name
    String unZipFilePath = zipFilePath.substring(0, zipFilePath.lastIndexOf("."));;	
    try {
      ZipFile zipFile = new ZipFile(zipFilePath);
      // provide password if encrypted
      if(zipFile.isEncrypted()){
        zipFile.setPassword("password");
      }
      // unzip
      zipFile.extractAll(unZipFilePath);
    } catch (ZipException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
  }
}

压缩整个目录并提供密码保护

如果必须递归压缩目录结构,则可以按照此处给出的方法进行压缩。示例中压缩的目录结构如下所示。

import net.lingala.zip4j.core.ZipFile;
import net.lingala.zip4j.exception.ZipException;
import net.lingala.zip4j.model.ZipParameters;
import net.lingala.zip4j.util.Zip4jConstants;

public class PwdZipFiles {

	public static void main(String[] args) {
		PwdZipFiles pwdZipFiles = new PwdZipFiles();
		// Directory to be zipped
		String dirPath = "F:\ZipTest";
		String zippedDirPath = "F:\ZipTest\ZippedDir.zip";
		pwdZipFiles.compressDirWithPwd(dirPath, zippedDirPath);
		pwdZipFiles.unZipPasswordProtectedFiles(zippedDirPath);

	}
	
	public void compressDirWithPwd(String dirPath, String zippedDirPath) {
		
		try {
			ZipFile zipFile = new ZipFile(zippedDirPath);
			
			// Initiate Zip Parameters 
			ZipParameters parameters = new ZipParameters();
			// set compression method to deflate compression
			parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE); 
			parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);
			parameters.setEncryptFiles(true);
			parameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_AES);
			parameters.setAesKeyStrength(Zip4jConstants.AES_STRENGTH_256);
			// Setting password
			parameters.setPassword("password");	        
			zipFile.addFolder(dirPath, parameters);

		} catch (ZipException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}				
	}
	
	public void unZipPasswordProtectedFiles(String zipFilePath){
		// Get unzip file path by removing .zip from the zipped file name
		String unZipFilePath = zipFilePath.substring(0, zipFilePath.lastIndexOf("."));;
		try {
			ZipFile zipFile = new ZipFile(zipFilePath);
			// provide password if encrypted
			if(zipFile.isEncrypted()){
				zipFile.setPassword("password");
			}
			// unzip
			zipFile.extractAll(unZipFilePath);
		} catch (ZipException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

我们可以看到解压缩压缩目录需要密码。