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日

相关文章

  • Spring Data JPA的Audit功能审计数据库的变更

    下面我来详细讲解Spring Data JPA的Audit功能审计数据库的变更的完整攻略。 什么是Spring Data JPA的Audit功能 Spring Data JPA的Audit功能是指将数据的变更操作记录下来,包括数据的新增、删除、修改等操作。通过Audit功能,我们可以了解数据的变更历史,并且可以追溯数据的操作者、操作时间等信息。 如何使用Sp…

    Java 2023年5月20日
    00
  • String.replaceAll方法详析(正则妙用)

    String.replaceAll方法详析(正则妙用) 介绍 在Java程序开发中,字符串的常见操作之一就是字符串替换。String类提供了replaceAll方法,可以基于正则表达式进行替换操作。本文将详细介绍String.replaceAll的用法,以及正则表达式的妙用。 方法定义 String类中用于替换的方法有两个:replace和replaceAl…

    Java 2023年5月27日
    00
  • 详解Java中雪花算法的实现

    详解Java中雪花算法的实现 需求概述 在分布式系统中,为了保证业务数据的唯一性,需要生成唯一的ID。传统的ID生成方式可能出现因为高并发而重复的情况,而雪花算法(Snowflake)正是为了解决这个问题而出现的。 本文会详细介绍Java中雪花算法的实现,及其原理。 雪花算法的基本原理 雪花算法是Twitter开源的分布式ID生成算法,采用一个64位的lon…

    Java 2023年5月19日
    00
  • SpringBoot @PostMapping接收HTTP请求的流数据问题

    要实现SpringBoot @PostMapping接收HTTP请求的流数据,需要遵循以下步骤: 在Controller中添加接口,使用@PostMapping注解,并使用@RequestBody注解请求参数; 创建一个封装流数据的Java对象,并使用@RequestBody注解接收请求参数; 在请求头中添加Content-Type字段,值为applicat…

    Java 2023年6月3日
    00
  • java Freemarker页面静态化实例详解

    Java FreeMarker页面静态化实例详解 什么是FreeMarker页面静态化 FreeMarker是一款基于模板技术实现的Java模板引擎,它可以将动态的HTML页面转化成静态的HTML页面,将一个基于模板的数据模型填充到模板中生成完整的HTML页面,并将HTML页面中的占位符等内容替换成相应的数据,将页面的内容动态的生成并输出。FreeMarke…

    Java 2023年6月15日
    00
  • 实例讲述Java IO文件复制

    来给大家详细讲解一下如何用Java IO实现文件复制的操作。 1. Java IO简介 Java IO库提供了一组类和接口,用于执行输入和输出(I/O)以及序列化。I/O就是指通过网络或其他外部层面,传输控制台,文件或任何Java代码与外部世界交互的数据。Java IO库还包括两个包,即java.io和java.nio,用于处理不同类型的输入,输出和序列化。…

    Java 2023年5月20日
    00
  • JSP开发之生成图片验证码技术的详解

    JSP开发之生成图片验证码技术的详解 什么是图片验证码 图片验证码是一种常见的图形验证码,用于验证用户是否为真实用户,防止恶意机器程序攻击,比如暴力破解密码、模拟用户登录等。图片验证码通常由一张随机生成的图像和一个文本框组成,用户需要手动输入图像中显示的文本才能通过验证。 生成图片验证码的技术 在JSP开发中,生成图片验证码的技术通常使用Java中的Grap…

    Java 2023年6月15日
    00
  • java经典问题:连个字符串互为回环变位

    标题:Java经典问题:连个字符串互为回环变位 问题描述 给定两个字符串,在不使用任何额外空间的情况下,判断这两个字符串是否互为回环变位。回环变位指的是将字符串中任意位置的字符剪切并粘贴到字符串末尾所得到的字符串。 例如,字符串 “abcde” 和 “cdeab” 就是互为回环变位的。 解决思路 对于给定的两个字符串 str1 和 str2,我们可以采取如下…

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