Java解压带密码的ZIP文件

在Java中,我们经常会遇到需要解压缩ZIP文件的需求。然而,有些ZIP文件可能会被设置了密码保护,这就需要我们使用密码来解压缩它们。本文将介绍如何使用Java解压带密码的ZIP文件,并提供相应的代码示例。

ZIP文件的解压

ZIP是一种常见的文件压缩格式,它可以将多个文件和文件夹打包成一个单一的文件。在Java中,我们可以使用java.util.zip包中的ZipInputStream类来解压ZIP文件。

首先,我们需要创建一个ZipInputStream对象,并将ZIP文件的输入流传递给它。然后,我们可以使用getNextEntry方法逐个获取ZIP文件中的条目(文件或文件夹),并将其解压到指定的目标目录中。

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

public class UnzipExample {
    public static void unzip(String zipFilePath, String destDirectory) throws IOException {
        File destDir = new File(destDirectory);
        if (!destDir.exists()) {
            destDir.mkdir();
        }
        ZipInputStream zipIn = new ZipInputStream(new FileInputStream(zipFilePath));
        ZipEntry entry = zipIn.getNextEntry();
        while (entry != null) {
            String filePath = destDirectory + File.separator + entry.getName();
            if (!entry.isDirectory()) {
                extractFile(zipIn, filePath);
            } else {
                File dir = new File(filePath);
                dir.mkdir();
            }
            zipIn.closeEntry();
            entry = zipIn.getNextEntry();
        }
        zipIn.close();
    }

    private static void extractFile(ZipInputStream zipIn, String filePath) throws IOException {
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(filePath));
        byte[] bytesIn = new byte[4096];
        int read;
        while ((read = zipIn.read(bytesIn)) != -1) {
            bos.write(bytesIn, 0, read);
        }
        bos.close();
    }

    public static void main(String[] args) {
        String zipFilePath = "path/to/your/zip/file.zip";
        String destDirectory = "path/to/your/destination/directory";
        try {
            unzip(zipFilePath, destDirectory);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

上述代码演示了如何使用Java解压ZIP文件。我们首先创建了一个ZipInputStream对象,并将ZIP文件的输入流传递给它。然后,我们使用getNextEntry方法逐个获取ZIP文件中的条目,并将其解压到指定的目标目录中。如果条目是一个文件,我们使用extractFile方法将其解压;如果是一个文件夹,我们创建一个对应的目录。

带密码的ZIP文件解压

有时候,ZIP文件可能会被设置了密码保护。在Java中,我们可以使用java.util.zip包中的ZipFile类来解压带密码的ZIP文件。

首先,我们需要创建一个ZipFile对象,并将ZIP文件的路径传递给它。然后,我们可以使用getInputStream方法获取ZIP文件中的条目的输入流,并将其解压到指定的目标目录中。

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

public class UnzipWithPasswordExample {
    public static void unzip(String zipFilePath, String destDirectory, String password) throws IOException {
        File destDir = new File(destDirectory);
        if (!destDir.exists()) {
            destDir.mkdir();
        }
        ZipFile zipFile = new ZipFile(zipFilePath);
        zipFile.setPassword(password.toCharArray());
        zipFile.stream().forEach(entry -> {
            try {
                String filePath = destDirectory + File.separator + entry.getFileName();
                if (!entry.isDirectory()) {
                    extractFile(zipFile.getInputStream(entry), filePath);
                } else {
                    File dir = new File(filePath);
                    dir.mkdir();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        });
        zipFile.close();
    }

    private static void extractFile(InputStream inputStream, String filePath) throws IOException {
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(filePath));
        byte[] bytesIn = new byte[4096];
        int read;
        while ((read = inputStream.read(bytesIn)) != -1) {
            bos.write(bytesIn, 0, read);
        }
        bos.close();
        inputStream.close();
    }

    public static void main(String[] args) {
        String zipFilePath = "path/to/your/encrypted/zip/file.zip";
        String destDirectory = "path/to/your/destination/directory";
        String password = "your_password