Java Zip文件读写操作详解

Java Zip文件读写操作详解

前言

Zip文件是一种常见的压缩文件格式,它可以有效地压缩多个文件,减小文件占用的存储空间。在Java开发中,也会经常用到Zip文件,因此掌握Java Zip文件读写操作是非常有必要的。

Zip文件读取操作

读取Zip文件可以使用Java中的ZipInputStream来实现。ZipInputStream可以将Zip文件中的多个文件逐一读取出来。

示例1:读取Zip文件中的单个文件并输出内容

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

public class ZipFileReaderDemo {
    public static void main(String[] args) throws IOException {
        String zipFilePath = "/path/to/zip/file.zip";
        ZipInputStream zis = new ZipInputStream(new FileInputStream(zipFilePath));

        ZipEntry entry;
        while ((entry = zis.getNextEntry()) != null) {
            if (entry.isDirectory()) {
                continue;
            }
            System.out.println("Entry Name: " + entry.getName());
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            byte[] buffer = new byte[1024];
            int count;
            while ((count = zis.read(buffer)) != -1) {
                baos.write(buffer, 0, count);
            }
            String data = baos.toString("UTF-8");
            System.out.println("Content: " + data);
        }
        zis.closeEntry();
        zis.close();
    }
}

代码中,我们首先实例化了一个ZipInputStream,该对象的构造函数需要传入Zip文件的输入流。然后,我们通过调用getNextEntry()方法依次获取Zip文件中的每个ZipEntry,也就是每个被压缩的文件。每读取一个ZipEntry,我们就分别读取它的文件名,以及文件内容和convertToString()将二进制读取过来的内容转换为字符串类型的输出。

示例2:读取Zip文件中的多个文件并解压到指定目录

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

public class ZipFileReaderDemo {
    public static void main(String[] args) throws IOException {
        String zipFilePath = "/path/to/zip/file.zip";
        Path unzipPath = Paths.get("/path/to/unzip/folder");

        //创建解压目录
        if (!Files.exists(unzipPath)) {
            Files.createDirectories(unzipPath);
        }

        ZipInputStream zis = new ZipInputStream(new FileInputStream(zipFilePath));
        ZipEntry entry;

        while ((entry = zis.getNextEntry()) != null) {
            //如果是目录则跳过
            if (entry.isDirectory()) {
                continue;
            }

            //解压到指定目录
            Path outputPath = unzipPath.resolve(entry.getName());
            try (OutputStream outputStream = Files.newOutputStream(outputPath)) {
                byte[] buffer = new byte[1024];
                int count;
                while ((count = zis.read(buffer)) != -1) {
                    outputStream.write(buffer, 0, count);
                }
                outputStream.flush();
            }
            zis.closeEntry();
        }

        zis.close();
    }
}

示例2与示例1所实现的功能不同,它将Zip文件中的多个文件解压到了指定的目录下。解压的操作也比较简单,首先我们需要判断ZipEntry是否为目录类型,如果是则跳过。否则,我们就根据ZipEntry的名称创建相应的输出文件路径,并通过Files.newOutputStream()创建文件的输出流。之后,我们使用byte数组来读取ZipInputStream中读取到的数据,并将它写入到输出流中即可。

Zip文件写入操作

Zip文件的写入操作可以使用Java的ZipOutputStream来实现。ZipOutputStream可以将多个文件压缩成一个Zip文件。

示例3:创建新的Zip文件

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

public class ZipFileWriterDemo {
    public static void main(String[] args) throws IOException {
        String zipFilePath = "/path/to/zip/file.zip";
        FileOutputStream fos = new FileOutputStream(zipFilePath);
        ZipOutputStream zos = new ZipOutputStream(fos);

        String[] fileNames = {"file1.txt", "file2.txt", "file3.txt"};

        for (String fileName : fileNames) {
            ZipEntry entry = new ZipEntry(fileName);
            zos.putNextEntry(entry);
            FileInputStream fis = new FileInputStream("/path/to/source/" + fileName);
            byte[] buffer = new byte[1024];
            int count;
            while ((count = fis.read(buffer)) != -1) {
                zos.write(buffer, 0, count);
            }
            fis.close();
            zos.closeEntry();
        }

        zos.close();
    }
}

代码中,我们首先实例化了一个ZipOutputStream,该对象的构造函数需要传入Zip文件的输出流。然后,我们将需要压缩的文件名保存在一个数组中,在循环中依次将这些文件压缩到Zip中。我们首先需要实例化ZipEntry,并通过putNextEntry()方法告诉ZipOutputStream这是一个新的ZipEntry。然后,我们读取需要压缩的文件,并且将读取到的文件数据写入ZipOutputStream中。最后,我们通过调用closeEntry()方法来告诉ZipOutputStream当前ZipEntry的写入结束。

示例4:向已存在的Zip文件写入文件

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

public class ZipFileWriterDemo {
    public static void main(String[] args) throws IOException {
        String zipFilePath = "/path/to/zip/file.zip";
        FileOutputStream fos = new FileOutputStream(zipFilePath, true);
        ZipOutputStream zos = new ZipOutputStream(fos);

        ZipEntry entry = new ZipEntry("new_file.txt");
        zos.putNextEntry(entry);
        FileInputStream fis = new FileInputStream("/path/to/source/new_file.txt");
        byte[] buffer = new byte[1024];
        int count;
        while ((count = fis.read(buffer)) != -1) {
            zos.write(buffer, 0, count);
        }
        fis.close();
        zos.closeEntry();

        zos.close();
    }
}

代码中,我们打开一个已存在的Zip文件,并且设置ZipOutputStream构造函数的第二个参数为true,表明我们需要以追加模式打开Zip文件。之后,我们通过ZipEntry创建一个新的ZipEntry,并将它压缩到ZipOutputStream中,与示例3的写法类似。注意,我们需要调用ZipOutputStream的closeEntry()方法来告诉它当前的ZipEntry写入结束。

总结

Zip文件读写在Java中是比较常用的操作。读取Zip文件可以使用ZipInputStream来实现,将文件写入Zip文件可以使用ZipOutputStream来实现。Zip文件的读写操作大致需要经历获取ZipEntry、读取文件内容、判断ZipEntry类型、创建ZipEntry等步骤,熟悉这些操作可以更高效地处理Zip文件。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java Zip文件读写操作详解 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • Java Web实现文件上传和下载接口功能详解

    Java Web实现文件上传和下载接口功能详解 一、文件上传接口 1. HTML表单 文件上传的第一步是需要在前端实现一个HTML表单,用户通过这个表单可以上传文件。表单中必须含有一个type为file的input元素,这个元素用来选择文件。 <form action="/upload" method="POST&quot…

    Java 2023年5月19日
    00
  • Java线程(Thread)四种停止方式代码实例

    Java线程(Thread)四种停止方式代码实例 在Java语言中,线程是非常常见的概念。在多线程编程过程中,需要经常使用到线程的停止操作。Java线程的停止方法有四种,分别是: 调用stop方法停止线程 使用interrupt方法打断线程 使用volatile布尔变量作为停止标志 使用线程阻塞等待退出 下面详细介绍这四种方式的代码实例。 1. 调用stop…

    Java 2023年5月18日
    00
  • Java 实现RSA非对称加密算法

    下面是详细讲解“Java 实现RSA非对称加密算法”的完整攻略: RSA非对称加密算法: RSA算法是一种非对称加密算法,由三位数学家,Rivest,Irving,Adi Shamir和Leonard Adleman发明,取名来自他们三人的名字缩写。RSA算法是一种常用的加密算法,它可以用于数字签名,密钥协商,数据加密等等。 RSA的原理: RSA非对称加密…

    Java 2023年5月19日
    00
  • javaweb 实现文件下载的方法及实例代码

    下面是详细讲解“javaweb 实现文件下载的方法及实例代码”的完整攻略。 前言 文件下载是 Web 开发中一个常见的需求场景,例如在网站中提供软件、文档、图片等资源的下载。本文将介绍如何在 JavaWeb 中实现文件下载功能,并提供两个示例代码。 实现方法 1. 基本思路 要实现文件下载功能,我们需要完成以下两个步骤: 从服务器上读取需要下载的文件,获取文…

    Java 2023年6月2日
    00
  • Java Map所有的值转为String类型

    要将Java Map中的所有值转换为String类型,可以采用以下步骤: 获取Map中所有的键值对 遍历所有的键值对,将值转换为String类型 以下是一个实现这个过程的Java示例代码: Map<String, Object> map = new HashMap<String, Object>(); map.put("ke…

    Java 2023年5月20日
    00
  • Java web数据可视化实现原理解析

    下面我会详细讲解“Java web数据可视化实现原理解析”的完整攻略。 Java web数据可视化实现原理解析 什么是数据可视化 数据可视化顾名思义就是将数据以可视化的方式展示出来,如图表、图像、地图等形式,以便更加直观地理解数据。在企业、政府等管理领域,数据可视化已经成为了非常重要的工具。 Java web实现数据可视化的原理 Java web实现数据可视…

    Java 2023年5月19日
    00
  • Spring Boot整合Bootstrap的超详细步骤

    下面是“Spring Boot整合Bootstrap的超详细步骤”完整攻略: 1. 引入Bootstrap资源 首先,在你的Web项目中引入Bootstrap资源,具体来说,就是将Bootstrap的CSS、JS等文件引入到项目中。你可以通过下载Bootstrap的官方资源文件并手工进行配置,也可以直接使用CDN引入。 下面示例展示了通过CDN直接引入Boo…

    Java 2023年5月15日
    00
  • 如何使用Spring integration在Springboot中集成Mqtt详解

    如何使用Spring Integration在Spring Boot中集成MQTT? Spring Integration的Mqtt模块提供了使用Java Mqtt客户端连接到MQTT代理的模板类、消息驱动通道适配器,在Spring Boot应用程序中非常容易集成。下面是使用Spring Integration在Spring Boot中集成MQTT的完整攻略…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部