Java 基础教程

Java 面向对象

Java 高级教程

Java 笔记

Java FAQ

java压缩文件夹下所有文件


在 Java 中,可以使用多种方式来压缩文件夹下的所有文件。以下是三种常用的实现方式:使用 Java 标准库、使用 Apache Commons Compress 库和使用 Java 的 ZipOutputStream。

使用 Java 标准库

Java 标准库提供了 ZipOutputStream 类来进行文件压缩。

步骤流程:

  1. 创建一个 ZipOutputStream 对象,将其与一个输出流(如 FileOutputStream)关联起来,以便将压缩数据写入文件。
  2. 遍历文件夹下的所有文件和子文件夹。
  3. 对于每个文件,创建一个 ZipEntry 对象,设置其名称,然后将其添加到 ZipOutputStream 中。
  4. 将文件内容写入 ZipOutputStream。
  5. 关闭 ZipOutputStream 以完成压缩。

示例代码:

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

public class ZipExample {
    public static void main(String[] args) throws IOException {
        String sourceFolder = "path/to/source/folder";
        String zipFile = "path/to/output/zipfile.zip";

        FileOutputStream fos = new FileOutputStream(zipFile);
        ZipOutputStream zipOut = new ZipOutputStream(fos);

        File fileToZip = new File(sourceFolder);
        zipFile(fileToZip, fileToZip.getName(), zipOut);

        zipOut.close();
        fos.close();
    }

    private static void zipFile(File fileToZip, String fileName, ZipOutputStream zipOut) throws IOException {
        if (fileToZip.isHidden()) {
            return;
        }
        if (fileToZip.isDirectory()) {
            File[] children = fileToZip.listFiles();
            for (File childFile : children) {
                zipFile(childFile, fileName + "/" + childFile.getName(), zipOut);
            }
            return;
        }
        FileInputStream fis = new FileInputStream(fileToZip);
        ZipEntry zipEntry = new ZipEntry(fileName);
        zipOut.putNextEntry(zipEntry);

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

使用 Apache Commons Compress 库

Apache Commons Compress 库提供了更多压缩格式的支持,如 gzip、tar 等。

Maven 依赖:

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-compress</artifactId>
    <version>1.21</version>
</dependency>

Gradle 依赖:

implementation 'org.apache.commons:commons-compress:1.21'

步骤流程:

  1. 创建一个 ArchiveOutputStream 对象,将其与一个输出流(如 FileOutputStream)关联起来,以便将压缩数据写入文件。
  2. 遍历文件夹下的所有文件和子文件夹。
  3. 对于每个文件,创建一个 ArchiveEntry 对象,设置其名称,然后将其添加到 ArchiveOutputStream 中。
  4. 将文件内容写入 ArchiveOutputStream。
  5. 关闭 ArchiveOutputStream 以完成压缩。

示例代码:

import org.apache.commons.compress.archivers.*;
import org.apache.commons.compress.utils.IOUtils;

import java.io.*;

public class CommonsCompressExample {
    public static void main(String[] args) throws IOException {
        String sourceFolder = "path/to/source/folder";
        String zipFile = "path/to/output/zipfile.zip";

        FileOutputStream fos = new FileOutputStream(zipFile);
        ArchiveOutputStream archiveOut = new ArchiveStreamFactory()
                .createArchiveOutputStream(ArchiveStreamFactory.ZIP, fos);

        File fileToZip = new File(sourceFolder);
        zipFile(fileToZip, "", archiveOut);

        archiveOut.close();
        fos.close();
    }

    private static void zipFile(File fileToZip, String entryName, ArchiveOutputStream archiveOut) throws IOException {
        if (fileToZip.isHidden()) {
            return;
        }
        if (fileToZip.isDirectory()) {
            ArchiveEntry archiveEntry = archiveOut.createArchiveEntry(fileToZip, entryName + "/");
            archiveOut.putArchiveEntry(archiveEntry);
            archiveOut.closeArchiveEntry();

            File[] children = fileToZip.listFiles();
            for (File childFile : children) {
                zipFile(childFile, entryName + "/" + childFile.getName(), archiveOut);
            }
            return;
        }
        FileInputStream fis = new FileInputStream(fileToZip);
        ArchiveEntry archiveEntry = archiveOut.createArchiveEntry(fileToZip, entryName);
        archiveOut.putArchiveEntry(archiveEntry);
        IOUtils.copy(fis, archiveOut);
        fis.close();
        archiveOut.closeArchiveEntry();
    }
}

使用 Java 的 ZipOutputStream

这是使用 Java 内置的 ZipOutputStream 类的另一种方式。

步骤流程:

  1. 创建一个 ZipOutputStream 对象,将其与一个输出流(如 FileOutputStream)关联起来,以便将压缩数据写入文件。
  2. 遍历文件夹下的所有文件和子文件夹。
  3. 对于每个文件,创建一个 ZipEntry 对象,设置其名称,然后将其添加到 ZipOutputStream 中。
  4. 将文件内容写入 ZipOutputStream。
  5. 关闭 ZipOutputStream 以完成压缩。

示例代码:

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

public class ZipOutputStreamExample {
    public static void main(String[] args) throws IOException {
        String sourceFolder = "path/to/source/folder";
        String zipFile = "path/to/output/zipfile.zip";

        FileOutputStream fos = new FileOutputStream(zipFile);
        ZipOutputStream zipOut = new ZipOutputStream(fos);

        File fileToZip = new File(sourceFolder);
        zipFile(fileToZip, fileToZip.getName(), zipOut);

        zipOut.close();
        fos.close();
    }

    private static void zipFile(File fileToZip, String fileName, ZipOutputStream zipOut) throws IOException {
        if (fileToZip.isHidden()) {
            return;
        }
        if (fileToZip.isDirectory()) {
            File[] children = fileToZip.listFiles();
            for (File childFile : children) {
                zipFile(childFile, fileName + "/" + childFile.getName(), zipOut);
            }
            return;
        }
        FileInputStream fis = new FileInputStream(fileToZip);
        ZipEntry zipEntry = new ZipEntry(fileName);
        zipOut.putNextEntry(zipEntry);

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

无论你选择哪种实现方式,都可以根据自己的需求来压缩文件夹下的所有文件。请注意替换示例代码中的文件路径以匹配你的实际情况。

下面我将介绍两种常用的实现方式:使用Java内置的ZipOutputStream和使用第三方库ApacheCommonsCompress。# ...
下面我将介绍两种常用的方式:使用Java内置库和使用第三方库ApacheCommonsCompress。对于每个文件,创建一个新的`ZipE ...
在Java中压缩字符串有多种实现方式,其中常用的方式包括使用GZIP压缩和使用Deflater压缩。以上就是使用GZIP和Deflater两 ...
关闭`ZipOutputStream`和所有的`FileInputStream`对象。示例代码:###使用ApacheCommonsComp ...
###方式一:使用Java原生库ImageIO步骤流程:1.示例代码:依赖坐标(Maven):依赖坐标(Gradle):###方式三:使用第 ...