Java中的Zip流

在Java中,zip流是一种用于压缩和解压缩文件的流。它可以将多个文件或目录压缩成一个zip文件,也可以将zip文件解压缩成多个文件或目录。在本文中,我们将介绍如何在Java中使用Zip流,并提供一些示例代码来演示其用法。

ZipOutputStream

ZipOutputStream是Java中用于创建zip文件的输出流。它可以将多个文件或目录压缩成一个zip文件。以下是一个使用ZipOutputStream创建zip文件的示例代码:

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

public class ZipExample {

    public static void main(String[] args) {
        String sourceDir = "path/to/source/directory";
        String zipFile = "path/to/destination/zipfile.zip";

        try (FileOutputStream fos = new FileOutputStream(zipFile);
             ZipOutputStream zos = new ZipOutputStream(fos)) {

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

            System.out.println("Zip file created successfully!");

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private static void zipDirectory(File dir, String dirName, ZipOutputStream zos) throws IOException {
        File[] files = dir.listFiles();

        if (files != null && files.length > 0) {
            for (File file : files) {
                if (file.isDirectory()) {
                    zipDirectory(file, dirName + "/" + file.getName(), zos);
                } else {
                    zipFile(file, dirName, zos);
                }
            }
        }
    }

    private static void zipFile(File file, String dirName, ZipOutputStream zos) throws IOException {
        FileInputStream fis = new FileInputStream(file);

        ZipEntry zipEntry = new ZipEntry(dirName + "/" + file.getName());
        zos.putNextEntry(zipEntry);

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

        fis.close();
        zos.closeEntry();
    }
}

在上面的代码中,我们首先指定了要压缩的源目录sourceDir和要创建的zip文件zipFile。然后,我们使用FileOutputStreamZipOutputStream来创建一个输出流,将文件写入到zip文件中。

zipDirectory方法用于递归地压缩目录和子目录中的所有文件。如果遇到子目录,它将调用自己来压缩子目录中的文件。zipFile方法用于压缩单个文件。

注意,在使用ZipOutputStream时,我们需要在使用完后手动关闭ZipOutputStreamFileOutputStream。使用try-with-resources语句可以确保资源会被正确关闭,即使发生异常。

ZipInputStream

ZipInputStream是Java中用于解压缩zip文件的输入流。它可以从zip文件中读取文件,并将其解压缩到指定目录中。以下是一个使用ZipInputStream解压缩zip文件的示例代码:

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

public class UnzipExample {

    public static void main(String[] args) {
        String zipFile = "path/to/source/zipfile.zip";
        String destDir = "path/to/destination/directory";

        try (FileInputStream fis = new FileInputStream(zipFile);
             ZipInputStream zis = new ZipInputStream(fis)) {

            ZipEntry zipEntry;
            byte[] buffer = new byte[1024];

            while ((zipEntry = zis.getNextEntry()) != null) {
                File newFile = new File(destDir, zipEntry.getName());

                if (zipEntry.isDirectory()) {
                    newFile.mkdirs();
                } else {
                    new File(newFile.getParent()).mkdirs();
                    extractFile(zis, newFile, buffer);
                }
            }

            System.out.println("Zip file extracted successfully!");

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private static void extractFile(ZipInputStream zis, File newFile, byte[] buffer) throws IOException {
        try (FileOutputStream fos = new FileOutputStream(newFile)) {
            int length;
            while ((length = zis.read(buffer)) > 0) {
                fos.write(buffer, 0, length);
            }
        }
    }
}

在上面的代码中,我们首先指定了要解压缩的zip文件zipFile和要创建的目录destDir。然后,我们使用FileInputStreamZipInputStream创建一个输入流,用于读取zip文件中的内容。

extractFile方法用于将zip文件中的单个文件