在Java编程语言中,压缩和解压缩文件是常见的任务,特别是在数据备份、文件传输和存储优化的场景下。将详细讲解如何运用Java来实现文件夹的压缩,并将其备份到目标文件夹。我们需要了解Java中用于处理压缩文件的核心库——java.util.zip。在Java中,我们可以使用ZipOutputStream类来创建ZIP压缩文件,以及ZipFileZipInputStream来读取和解压ZIP文件。ZipOutputStream是一个字节流,用于将数据写入ZIP格式的输出流。我们可以通过创建一个FileOutputStream对象指向目标文件,然后将其传递给ZipOutputStream的构造函数来开始压缩过程。以下是一个简单的示例,展示如何使用Java压缩一个文件夹:


import java.io.*;

import java.nio.file.Files;

import java.nio.file.Paths;

import java.util.zip.ZipEntry;

import java.util.zip.ZipOutputStream;

public class CompressFolder {

  public static void main(String[] args) {

    String sourceFolder = \"源文件夹路径\";

    String targetZipFile = \"目标文件夹路径backup.zip\";

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

      addFolderToZip(\"\", Paths.get(sourceFolder), zos);

    } catch (IOException e) {

      e.printStackTrace();

    }

  }



  private static void addFolderToZip(String prefix, Path folder, ZipOutputStream zos) throws IOException {

    Files.walk(folder)

      .filter(Files::isRegularFile)

      .forEach(path -> {

        try {

          ZipEntry zipEntry = new ZipEntry(prefix + path.getFileName().toString());

          zos.putNextEntry(zipEntry);

          Files.copy(path, zos);

          zos.closeEntry();

        } catch (IOException e) {

          e.printStackTrace();

        }

      });

  }

}

在这个例子中,addFolderToZip方法递归地遍历文件夹中的所有文件,创建对应的ZipEntry对象,并将文件内容写入ZipOutputStream。为了保持文件结构,我们需要将文件路径转换为相对路径。备份到目标文件夹可以通过Files.copy方法实现,提供源文件和目标文件路径即可。

解压缩方面,可以使用ZipFile类来读取ZIP文件,然后通过ZipInputStream逐个提取ZipEntry。以下是示例代码:


import java.io.*;

import java.nio.file.Paths;

import java.util.zip.ZipEntry;

import java.util.zip.ZipFile;

public class UnzipFile {

  public static void main(String[] args) {

    String sourceZipFile = \"源zip文件路径\";

    String targetFolder = \"解压目标文件夹路径\";

    try (ZipFile zipFile = new ZipFile(sourceZipFile)) {

      Enumeration entries = zipFile.entries();

      while (entries.hasMoreElements()) {

        ZipEntry entry = entries.nextElement();

        unzipEntry(entry, zipFile, targetFolder);

      }

    } catch (IOException e) {

      e.printStackTrace();

    }

  }



  private static void unzipEntry(ZipEntry entry, ZipFile zipFile, String targetFolder) throws IOException {

    if (!entry.isDirectory()) {

      File entryFile = new File(targetFolder, entry.getName());

      if (!entryFile.getParentFile().exists()) {

        entryFile.getParentFile().mkdirs();

      }

      try (InputStream is = zipFile.getInputStream(entry); FileOutputStream fos = new FileOutputStream(entryFile)) {

        byte[] buffer = new byte[1024];

        int read;

        while ((read = is.read(buffer)) != -1) {

          fos.write(buffer, 0, read);

        }

      }

    }

  }

}