Java 解压缩

压缩和解压缩是在计算机科学领域中常见的操作。它们被广泛应用于文件传输、数据存储和备份等方面。在 Java 中,我们可以使用内置的 java.util.zip 包来完成文件的压缩和解压缩操作。本文将介绍如何使用 Java 进行解压缩,并提供相关的代码示例。

压缩文件

在进行解压缩之前,我们首先需要将文件压缩成一个压缩包。Java 提供了 ZipOutputStream 类来实现文件的压缩。下面是一个示例代码,用于将指定目录下的所有文件压缩成一个 Zip 文件:

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

public class ZipUtility {
    public static void compress(String sourceDir, String destinationZipFile) throws IOException {
        FileOutputStream fos = new FileOutputStream(destinationZipFile);
        ZipOutputStream zos = new ZipOutputStream(fos);

        File file = new File(sourceDir);
        compressDirectory(file, file.getName(), zos);

        zos.closeEntry();
        zos.close();
        fos.close();

        System.out.println("压缩完成!");
    }

    private static void compressDirectory(File dir, String baseDir, ZipOutputStream zos) throws IOException {
        File[] files = dir.listFiles();
        byte[] buffer = new byte[1024];

        for (File file : files) {
            if (file.isDirectory()) {
                compressDirectory(file, baseDir + "/" + file.getName(), zos);
                continue;
            }

            FileInputStream fis = new FileInputStream(file);
            zos.putNextEntry(new ZipEntry(baseDir + "/" + file.getName()));

            int length;
            while ((length = fis.read(buffer)) > 0) {
                zos.write(buffer, 0, length);
            }

            fis.close();
        }
    }
}

上述代码中,compress 方法接受源目录和目标 Zip 文件的路径作为参数,将源目录中的所有文件压缩成一个 Zip 文件。compressDirectory 方法用于递归地压缩目录下的所有文件和子目录。

解压缩文件

Java 提供了 ZipInputStream 类来实现文件的解压缩。下面是一个示例代码,用于将压缩包中的文件解压到指定目录:

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

public class UnzipUtility {
    public static void decompress(String zipFile, String destDir) throws IOException {
        byte[] buffer = new byte[1024];

        File folder = new File(destDir);
        if (!folder.exists()) {
            folder.mkdir();
        }

        ZipInputStream zis = new ZipInputStream(new FileInputStream(zipFile));
        ZipEntry entry = zis.getNextEntry();

        while (entry != null) {
            String fileName = entry.getName();
            File newFile = new File(destDir + File.separator + fileName);

            if (entry.isDirectory()) {
                newFile.mkdirs();
            } else {
                FileOutputStream fos = new FileOutputStream(newFile);

                int length;
                while ((length = zis.read(buffer)) > 0) {
                    fos.write(buffer, 0, length);
                }

                fos.close();
            }

            zis.closeEntry();
            entry = zis.getNextEntry();
        }

        zis.close();

        System.out.println("解压完成!");
    }
}

上述代码中,decompress 方法接受压缩包路径和目标目录路径作为参数,将压缩包中的文件解压到目标目录。如果压缩包中有子目录,将会在目标目录中创建相应的目录结构。

使用示例

下面是一个使用示例,将一个目录压缩成 Zip 文件,并将该 Zip 文件解压到指定目录:

public class Main {
    public static void main(String[] args) {
        String sourceDir = "/path/to/source/directory";
        String destinationZipFile = "/path/to/destination/zip/file.zip";
        String destDir = "/path/to/destination/directory";

        try {
            ZipUtility.compress(sourceDir, destinationZipFile);
            UnzipUtility.decompress(destinationZipFile, destDir);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

将上述代码中的路径替换为实际路径,并执行程序,即可完成文件的压缩和解压缩操作。

状态图

下面是压缩和解压缩操作的状态图:

stateDiagram
    [*] --> Compress
    Compress --> [*]
    Compress --> Decom