Java压缩ZIP

在Java编程中,经常需要对文件或文件夹进行压缩和解压操作。其中,ZIP是最常见和广泛支持的压缩格式之一。本文将介绍如何使用Java压缩和解压ZIP文件,并提供相应的代码示例。

ZIP压缩

使用Java压缩ZIP文件需要使用java.util.zip包中的相关类。首先,我们需要创建一个压缩文件,并向其中写入要压缩的文件和文件夹。接下来,我们将逐步介绍如何实现这一过程。

创建ZIP文件

首先,我们需要创建一个ZipOutputStream对象,该对象用于将数据写入ZIP文件。我们可以通过将FileOutputStreamZipOutputStream结合使用来实现这一点,如下所示:

import java.io.File;
import java.io.FileOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class ZipUtils {
    public static void createZipFile(String sourceFolder, String zipFilePath) {
        try {
            FileOutputStream fos = new FileOutputStream(zipFilePath);
            ZipOutputStream zos = new ZipOutputStream(fos);

            File folder = new File(sourceFolder);
            addFolderToZip(folder, folder.getName(), zos);

            zos.closeEntry();
            zos.close();
            fos.close();
            
            System.out.println("ZIP文件创建成功!");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static void addFolderToZip(File folder, String parentFolder, ZipOutputStream zos) throws Exception {
        for (File file : folder.listFiles()) {
            if (file.isDirectory()) {
                addFolderToZip(file, parentFolder + "/" + file.getName(), zos);
                continue;
            }

            byte[] buffer = new byte[1024];
            FileInputStream fis = new FileInputStream(file);
            zos.putNextEntry(new ZipEntry(parentFolder + "/" + file.getName()));
  
            int length;
            while ((length = fis.read(buffer)) > 0) {
                zos.write(buffer, 0, length);
            }
  
            fis.close();
        }
    }
}

代码中的createZipFile方法接受两个参数:sourceFolderzipFilePathsourceFolder是要压缩的文件夹的路径,zipFilePath是要创建的ZIP文件的路径。该方法使用FileOutputStream创建一个输出流,并将其与ZipOutputStream关联。然后,调用addFolderToZip方法,将源文件夹的内容逐个添加到ZIP文件中。最后,关闭有关的流。

压缩文件夹

为了将文件夹及其内容压缩到ZIP文件中,我们需要创建一个递归方法addFolderToZip。该方法接受三个参数:folderparentFolderzosfolder是要添加到ZIP文件中的文件夹,parentFolder是其上级文件夹的路径,zos是用于写入ZIP文件的ZipOutputStream对象。

该方法首先遍历文件夹中的所有文件和子文件夹。如果遇到一个子文件夹,方法将递归调用自身,将子文件夹及其内容添加到ZIP文件中。如果遇到一个文件,则会创建一个ZipEntry对象,用于表示ZIP文件中的一个条目,并通过zos.putNextEntry方法将其添加到ZIP文件中。然后,将文件的内容写入到ZIP文件中,直到结束。

ZIP解压

在Java中解压ZIP文件也非常简单。我们只需使用java.util.zip包中的ZipInputStream类来实现。接下来,我们将逐步介绍如何解压ZIP文件。

解压ZIP文件

下面是一个示例代码,演示了如何解压ZIP文件到指定的目标文件夹:

import java.io.File;
import java.io.FileOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

public class UnzipUtils {
    public static void unzipFile(String zipFilePath, String destFolder) {
        try {
            File folder = new File(destFolder);
            if (!folder.exists()) {
                folder.mkdir();
            }

            ZipInputStream zis = new ZipInputStream(new FileInputStream(zipFilePath));
            ZipEntry entry;

            while ((entry = zis.getNextEntry()) != null) {
                String filePath = destFolder + File.separator + entry.getName();
                if (entry.isDirectory()) {
                    File dir = new File(filePath);
                    dir.mkdir();
                } else {
                    FileOutputStream fos = new FileOutputStream(filePath);
                    byte[] buffer = new byte[102