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日

相关文章

  • jquery自定义下拉列表示例

    下面我来详细讲解一下“jQuery自定义下拉列表”的制作方法。 1. 简介 自定义下拉列表可以提升页面的交互体验,并且可以使页面更加美观。本文将使用jQuery来创建自定义下拉列表,包括如何使用HTML、CSS和JavaScript来实现。 2. 实现过程 下面我们以两个示例来详细讲解如何实现自定义下拉列表。 示例一 在这个示例中,我们将使用一个普通的&lt…

    Java 2023年5月19日
    00
  • SpringBoot集成内存数据库Sqlite的实践

    下面我将为您详细讲解“SpringBoot集成内存数据库Sqlite的实践”的完整攻略。 1. 关于Sqlite Sqlite是一种轻量级的关系型数据库,最主要的特点是没有独立的进程,所有的数据库操作都直接在应用程序内部完成,这使得Sqlite非常适合一些较小的场景,例如移动应用或单机桌面应用等。由于Sqlite的持久化方式是基于文件的,所以它也被称为嵌入式…

    Java 2023年5月20日
    00
  • Mybatis如何通过接口实现sql执行原理解析

    Mybatis是一款使用Java对象与数据库之间的映射配置来处理原始SQL的轻量级ORM框架。它可以通过接口实现 SQL 执行原理,实现原理如下: 在Mybatis中,每个mapper接口都对应了一个mapper xml文件。在mapper xml文件中涵盖了众多的SQL语句。 当应用程序访问mapper接口中的方法时,Mybatis会根据方法名去查询map…

    Java 2023年5月20日
    00
  • Java实现的properties文件动态修改并自动保存工具类

    我会详细讲解“Java实现的properties文件动态修改并自动保存工具类”的完整攻略,包括实现细节和示例。 什么是properties文件? 在Java语言中,Properties类是一种用于表示一组持久性属性的集合的取消息类。在程序中,常常需要读取一些配置信息,比如数据库连接字符串、账号密码等信息,这些信息被经常被存储在一个文本文件中,这个文本文件的格…

    Java 2023年5月19日
    00
  • Springboot内外部logback多环境配置详解

    针对“Springboot内外部logback多环境配置详解”这个主题,以下是完整的攻略: 简介 本文主要是介绍如何在Springboot应用中使用logback日志框架,并实现根据不同环境配置不同的日志输出。 前提条件 在开始之前,需要保证你已经: 了解并掌握了Springboot应用开发和使用过程; 能够使用logback进行日志输出; 对logback…

    Java 2023年5月20日
    00
  • sprng和struts有什么区别?

    sprng和struts有什么区别? 背景介绍 sprng(简称Spring)和struts是两个常见的Java Web框架,都是基于MVC设计模式。它们都能帮助开发人员加快Web应用程序开发的速度。 区别 1. 关注点不同 Spring框架的主要关注点在于IoC(Inverse of Control,控制反转)和AOP(Aspect-Oriented Pr…

    Java 2023年5月20日
    00
  • Spring使用注解方式处理事务

    当我们在使用Spring框架时,事务管理是一个非常重要的概念。Spring提供了多种方式来处理事务,其中注解方式是一种常用的方式,因为它可以大大简化我们的配置和开发过程。 下面,我会详细讲解如何使用注解方式处理事务,并且提供两个示例。 1. 配置数据源和事务管理器 首先,我们需要配置数据源和事务管理器,这里以MySQL数据库为例。在Spring中配置数据源和…

    Java 2023年5月20日
    00
  • Spring Cloud Config 使用本地配置文件方式

    下面是关于Spring Cloud Config使用本地配置文件的攻略: 什么是Spring Cloud Config? Spring Cloud Config 是一个分布式配置服务,目的是为分布式系统中的基础设施和微服务应用提供一种集中化的外部配置支持。 使用本地配置文件方式 步骤一:创建本地配置文件 在本地文件系统的一个目录下创建一个配置文件,比如:ap…

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