📜  用Java创建受密码保护的 Zip 文件(1)

📅  最后修改于: 2023-12-03 14:56:18.068000             🧑  作者: Mango

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

在Java中,可以使用ZipOutputStream类创建.zip文件。为了保护.zip文件中的数据,我们可以添加密码来加密文件。在本教程中,我们将探讨如何使用Java创建受密码保护的Zip文件。

创建Zip文件

要创建Zip文件,我们需要使用Java的ZipOutputStream类。以下是一个示例代码片段,演示如何使用ZipOutputStream类创建Zip文件:

import java.io.*;
import java.util.zip.*;

public class CreateZipFile {
   public static void main(String[] args) throws IOException {
      String sourceFile = "source_directory"; //要打包的文件夹
      FileOutputStream fos = new FileOutputStream("myzip.zip"); //Zip文件名
      ZipOutputStream zipOut = new ZipOutputStream(fos);
      File fileToZip = new File(sourceFile);
      zipFile(fileToZip, fileToZip.getName(), zipOut);
      zipOut.close();
      fos.close();
   }
   private static void zipFile(File fileToZip, String fileName, ZipOutputStream zipOut) throws IOException {
      if (fileToZip.isHidden()) {
         return;
      }
      if (fileToZip.isDirectory()) {
         File[] children = fileToZip.listFiles();
         for (File childFile : children) {
            zipFile(childFile, fileName + "/" + childFile.getName(), zipOut);
         }
         return;
      }
      FileInputStream fis = new FileInputStream(fileToZip);
      ZipEntry zipEntry = new ZipEntry(fileName);
      zipOut.putNextEntry(zipEntry);

      byte[] bytes = new byte[1024];
      int length;
      while ((length = fis.read(bytes)) >= 0) {
         zipOut.write(bytes, 0, length);
      }
      fis.close();
   }
}

在上述代码中,我们首先创建了一个ZipOutputStream对象,来将我们的文件夹压缩成一个Zip文件。接着,我们定义了一个File对象,以及一个用于打包的方法zipFile()。在zipFile()方法中,我们检查文件是否是隐藏文件,如果是,就返回。如果文件夹则递归打包,如果是文件则将文件添加到ZipOutputStream对象中。最后,我们使用zipOut.close()来结束制作Zip文件。

如果现在运行程序,将会在程序所在位置生成一个名为myzip.zip的文件,其中包括一个名为source_directory的文件夹中的所有文件和子文件夹。

安全Zip文件

创建Zip文件之后,现在我们可以开始添加密码来保护Zip文件。在Java中,可以使用Java Cryptography Extension(JCE)实现Zip文件密码保护。以下是一个示例代码片段,演示如何添加密码保护Zip文件:

import java.io.*;
import java.util.zip.*;
import java.security.*;
import javax.crypto.*;
import javax.crypto.spec.*;

public class SecureZipFile {
   public static void main(String[] args) throws Exception {
      String sourceFile = "source_directory";
      FileOutputStream fos = new FileOutputStream("securezip.zip");
      ZipOutputStream zipOut = new ZipOutputStream(fos);
      File fileToZip = new File(sourceFile);
      zipFile(fileToZip, fileToZip.getName(), zipOut);

      String password = "mypassword";
      zipOut.close();
      fos.close();
      
      byte[] zip = readFile("securezip.zip");
      byte[] zipWithPassword = addPassword(zip, password);
      saveToFile(zipWithPassword, "securezip.zip");
   }

   private static void zipFile(File fileToZip, String fileName, ZipOutputStream zipOut) throws IOException {
      // 与前面的代码片段相同
   }

   private static byte[] readFile(String path) throws IOException {
      File file = new File(path);
      byte[] buffer = new byte[(int) file.length()];
      FileInputStream fis = new FileInputStream(file);
      fis.read(buffer);
      fis.close();
      return buffer;
   }

   private static void saveToFile(byte[] bytes, String path) throws IOException {
      FileOutputStream fos = new FileOutputStream(path);
      fos.write(bytes);
      fos.close();
   }

   private static byte[] addPassword(byte[] zip, String password) throws Exception {
      ByteArrayOutputStream baos = new ByteArrayOutputStream();
      ZipOutputStream zipOut = new ZipOutputStream(baos);
      zipOut.setMethod(ZipOutputStream.DEFLATED);
      zipOut.setLevel(Deflater.BEST_COMPRESSION);
      zipOut.setPassword(password.toCharArray());

      ZipInputStream zipIn = new ZipInputStream(new ByteArrayInputStream(zip));
      ZipEntry entry;
      while ((entry = zipIn.getNextEntry()) != null) {
         zipOut.putNextEntry(new ZipEntry(entry.getName()));
         byte[] buffer = new byte[2048];
         int length;
         while ((length = zipIn.read(buffer)) >= 0) {
            zipOut.write(buffer, 0, length);
         }
         zipIn.closeEntry();
      }
      zipIn.close();
      zipOut.close();
      return baos.toByteArray();
   }
}

在 SecureZipFile 中,我们添加了三个新方法readFile()、saveToFile()和addPassword()。readFile()方法用于从文件中读取数据,saveToFile()方法用于将数据写入文件。addPassword()方法用于使用密码保护Zip文件。

在main()方法中,我们首先将文件夹打包成Zip文件。接着,我们定义密码,关闭ZipOutputStream对象(zipOut.close()),并将文件读取到内存(zip[])。最后,我们在addPassword()中使用getBytes()方法,即将密码转换为字节数组,并设置ZipOutputStream对象的密码。

如果你现在运行程序,将会在程序所在位置生成名为securezip.zip的文件。当你尝试打开Zip文件时,会提示输入密码才能解压缩文件。