迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > Java >

Java 中的 Zip 文件

作者:迹忆客 最近更新:2023/05/15 浏览次数:

一个 zip 文件可以由一个文件、多个文件甚至一个文件夹组成。 有多种创建 zip 文件的方法。

本篇文章介绍了使用 Java 创建 zip 文件的不同示例。


使用 Java.Util.Zip 在 Java 中压缩单个文件

我们可以使用 java.util.zip.ZipOutputStream 类在 Java 中压缩单个文件。 请参见下面的示例:

package jiyik;

import java.io.*;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.Files;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class Create_Zip {

    public static void main(String[] args) {

        Path Source_File = Paths.get("C:\\Users\\Sheeraz\\OneDrive\\Desktop\\ZipFiles\\jiyik1.txt");
        String Output_Zip = "C:\\Users\\Sheeraz\\OneDrive\\Desktop\\ZipFiles\\NewZip.zip";

        try {
            Create_Zip.Create_Zip_File(Source_File, Output_Zip);
            System.out.println("Zip File Created");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    // method to zip a single file
    public static void Create_Zip_File(Path Source_File, String Output_Zip)
        throws IOException {

        if (!Files.isRegularFile(Source_File)) {
            System.err.println("File Not Found.");
            return;
        }

        try (
            ZipOutputStream Zip_Output_Stream = new ZipOutputStream(
                new FileOutputStream(Output_Zip));
            FileInputStream File_Input_Stream = new FileInputStream(Source_File.toFile());
        ) {

            ZipEntry Zip_Entry = new ZipEntry(Source_File.getFileName().toString());
            Zip_Output_Stream.putNextEntry(Zip_Entry);

            byte[] Buffer = new byte[1024];
            int Length;
            while ((Length = File_Input_Stream.read(Buffer)) > 0) {
                Zip_Output_Stream.write(Buffer, 0, Length);
            }
            Zip_Output_Stream.closeEntry();
        }
    }
}

上面的代码将创建一个仅包含单个文件 jiyik1 的 zip 文件。

输出:

Zip File Created

Single File


使用 Java.Util.Zip 在 Java 中压缩多个文件

同样,我们可以使用 java.util.zip.ZipOutputStream 将多个文件添加到一个 zip 文件中。 多个文件被一个一个地添加到 zip 文件中。

请参阅以下示例:

package jiyik;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
public class Create_Zip {
    public static void main(String[] args) {
        try {
            //The Source file paths
            String Source_File1 = "C:\\Users\\Sheeraz\\OneDrive\\Desktop\\ZipFiles\\jiyik1.txt";
            String Source_File2 = "C:\\Users\\Sheeraz\\OneDrive\\Desktop\\ZipFiles\\\\jiyik2.txt";
            //Output Zipped file path
            String Output_Zip_Path = "C:\\Users\\Sheeraz\\OneDrive\\Desktop\\ZipFiles\\NewZip.zip";

            File Output_Zip = new File(Output_Zip_Path);
            FileOutputStream File_Output_Stream  = new FileOutputStream( Output_Zip);
            ZipOutputStream Zip_Output_Stream = new ZipOutputStream(File_Output_Stream);

            Create_Zip_File(Source_File1, Zip_Output_Stream);
            Create_Zip_File(Source_File2, Zip_Output_Stream);
            Zip_Output_Stream.close();
            System.out.println("Zip File Created");
        }
        catch (IOException e) {
            e.printStackTrace();
        }
    }
    // Method to create the zip file
    private static void Create_Zip_File(String Source_File, ZipOutputStream Zip_Output_Stream) throws IOException {
        final int BUFFER = 1024;
        BufferedInputStream Buffered_Input_Stream = null;
        try {
            File file = new File(Source_File);
            FileInputStream File_Input_Stream = new FileInputStream(file);
            Buffered_Input_Stream = new BufferedInputStream(File_Input_Stream, BUFFER);

            ZipEntry Zip_Entry = new ZipEntry(file.getName());
            Zip_Output_Stream.putNextEntry(Zip_Entry);
            byte Data[] = new byte[BUFFER];
            int Length;
            while((Length = Buffered_Input_Stream.read(Data, 0, BUFFER)) != -1) {
            Zip_Output_Stream.write(Data, 0, Length);
            }
        // close the entry
        Zip_Output_Stream.closeEntry();
        }
        finally {
            try {
                Buffered_Input_Stream.close();
            }
            catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

上面的代码会将多个文件添加到一个 zip 文件中。

输出:

Zip File Created

Multiple Files


使用 Java.Util.Zip 在 Java 中压缩文件夹

Java.Util.Zip 还可以压缩文件夹或目录,包括所有子文件夹和文件。 请参见下面的示例:

package jiyik;

import java.io.IOException;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class Create_Zip {

    public static void main(String[] args) {

        Path Source_Folder = Paths.get("C:\\Users\\Sheeraz\\OneDrive\\Desktop\\ZipFiles\\Folder");

        if (!Files.isDirectory(Source_Folder)) {
            System.out.println("Please provide the right folder.");
            return;
        }

        try {
            Create_Zip.Create_Zip_Folder(Source_Folder);
            System.out.println("Folder is zipped");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    // zip a directory or folder
    public static void Create_Zip_Folder(Path Source_Folder) throws IOException {

        // get folder name as zip file name
        String Output_Zip = Source_Folder.getFileName().toString() + ".zip";

        try (
                ZipOutputStream Zip_Output_Stream = new ZipOutputStream(
                        new FileOutputStream(Output_Zip))
        ) {
            Files.walkFileTree(Source_Folder, new SimpleFileVisitor<>() {
                @Override
                public FileVisitResult visitFile(Path File,
                    BasicFileAttributes File_Attributes) {

                    // only copy files
                    if (File_Attributes.isSymbolicLink()) {
                        return FileVisitResult.CONTINUE;
                    }

                    try (FileInputStream File_Input_Stream = new FileInputStream(File.toFile())) {

                        Path targetFile = Source_Folder.relativize(File);
                        Zip_Output_Stream.putNextEntry(new ZipEntry(targetFile.toString()));

                        byte[] BUFFER = new byte[1024];
                        int Length;
                        while ((Length = File_Input_Stream.read(BUFFER)) > 0) {
                            Zip_Output_Stream.write(BUFFER, 0, Length);
                        }

                        Zip_Output_Stream.closeEntry();

                        System.out.printf("Zipped file : %s%n", File);

                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    return FileVisitResult.CONTINUE;
                }

                @Override
                public FileVisitResult visitFileFailed(Path File, IOException exception) {
                    System.err.printf("Unable to zip the file : %s%n%s%n", File, exception);
                    return FileVisitResult.CONTINUE;
                }
            });
        }
    }
}

上面的代码将压缩给定的文件夹。

输出:

Zipped file : C:\Users\Sheeraz\OneDrive\Desktop\ZipFiles\Folder\jiyik1.txt
Zipped file : C:\Users\Sheeraz\OneDrive\Desktop\ZipFiles\Folder\jiyik2.txt
Folder is zipped

Zip Folder

还有其他方法,如文件系统或 zip4j 可以压缩文件或文件夹。 但是,Java.Util.Zip 被认为是压缩文件和文件夹的最有效方式。

上一篇:使用 Java 删除目录中的文件

下一篇:没有了

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

使用 Java 删除目录中的文件

发布时间:2023/05/15 浏览次数:190 分类:Java

在本文中,我们将学习如何在不删除文件夹本身的情况下删除文件夹中的文件。有多种方法可以做到这一点。 在 Java 中使用文件类的 delete() 删除目录中的文件

在 Java 中从文件中读取字节

发布时间:2023/05/15 浏览次数:182 分类:Java

Java 中有几种方法可以从文件中读取字节或将文件转换为字节或字节数组。 本教程演示了用 Java 从文件中读取字节的不同方法。

Kotlin 中 Java String[] 的等价物

发布时间:2023/05/13 浏览次数:59 分类:Java

本文介绍了 Kotlin 中 Java String[] 的等价物。 我们将看到所有可能的方法来为 Kotlin 实现与 Java 中的 String[] 相同的结果。

将 Java 文件代码转换为 Kotlin

发布时间:2023/05/13 浏览次数:143 分类:Java

Kotlin 现在是一种官方的 Android 语言。 因此,您可能希望将 Java 文件更改为 Kotlin。 本文教您如何将 Java 转换为 Kotlin。

在 Kotlin 中使用 forEach

发布时间:2023/05/13 浏览次数:122 分类:Java

本文介绍 Kotlin 中 forEach 关键字的概念和使用。 我们将看到一些使用 Kotlin forEach 循环的示例来理解它。

在 Kotlin 中使用 reified 关键字

发布时间:2023/05/13 浏览次数:197 分类:Java

reified 关键字是在 Kotlin 中使用泛型时最常使用的编程概念。在本教程中,我们将学习如何使用两种方法解决此问题,包括将类型的类作为泛型函数的参数传递,以及将 reified 关键字与内联函数

Kotlin 中 ! 和 ? 运算符之间的区别

发布时间:2023/05/13 浏览次数:180 分类:Java

在 Kotlin 中,断言运算符 !! 和安全调用符 ? 使用 Null 安全。本文介绍空安全的概念。 我们也将通过如何! 和 ? 在 Kotlin 中有助于空安全。

Android Studio 中的 Kotlin 打印到控制台

发布时间:2023/05/13 浏览次数:55 分类:Java

Kotlin 的 logcat 窗口可以实时显示输出,让开发人员能够高效地处理他们的代码。 今天,我们将完成将消息打印到 Kotlin 控制台的步骤。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便