Java Zip文件读写操作详解

 更新时间:2022年11月09日 09:16:03   作者:OlaiolaiO  
这篇文章主要为大家详细介绍了如何利用Java ZipInputstream、ZipOutputStream实现获取每个文件中的内容与写入内容,感兴趣的可以动手尝试一下

输入流(读取):

ZipInputStream是一种FileInputStream流,它可以直接读取Zip压缩包的内容:

┌───────────────────┐
│    InputStream    │
└───────────────────┘
          ▲
          │
┌───────────────────┐
│ FilterInputStream │
└───────────────────┘
          ▲
          │
┌───────────────────┐
│InflaterInputStream│
└───────────────────┘
          ▲
          │
┌───────────────────┐
│  ZipInputStream   │
└───────────────────┘
          ▲
          │
┌───────────────────┐
│  JarInputStream   │
└───────────────────┘

另一个JarInputstream是从ZipInputStream派生出来的,它增加的主要功能是直接读取jar文件里面的MANIFEST.MF文件。因为本质上jar包就是zip包,只是额外增加了一些固定的描述文件。

根据上述继承关系,最终还是回到了Inputstream这个抽象类中。而Java的IO标准库使用Decorator装饰器模式为Inputstream和OutputStream增加功能:

可以把一个Inputstream和任意一个FilterInputStream组合。

可以把一个OutputStream和任意一个FilterOutputStream组合。

通过装饰器模式也就可以使用ZipInputStream来操作ZIP文件了。

ZipInputstream的基本用法是:

创建一个ZipInputstream对象,传入一个FileInputstream作为数据源,然后调用getNextEntry()方法,直到返回值为null,表示zip流结束。

一个ZipEntry表示一个压缩文件或目录,如果是压缩文件,我们就用read()方法不断读取,直到返回-1:

import java.io.FileInputStream;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
public class Demo02 {
    public static void main(String[] args) {
        try (ZipInputStream zip = new ZipInputStream(new FileInputStream("d:\\IOTest\\1-201023201325.zip"),
                Charset.forName("gbk"))) {
            ZipEntry entry = null;
            // 获取压缩文件中的每个子文件
            while ((entry = zip.getNextEntry()) != null) {
                System.out.println(entry.getName());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

输出流(写入):

也称为压缩流,它用于以zip格式写入文件,也就是把文件打包成压缩文件,常用于附件下载,文件压缩存储。

┌───────────────────┐
│    OutputStream   │
└───────────────────┘
          ▲
          │
┌───────────────────┐
│ FilterInputStream │
└───────────────────┘
          ▲
          │
┌────────────────────┐
│DeflaterOutputStream│
└────────────────────┘
          ▲
          │
┌───────────────────┐
│  ZipInputStream   │
└───────────────────┘
          ▲
          │
┌───────────────────┐
│  JarOutputStream  │
└───────────────────┘

压缩流常用的两个方法为:

1.

// 开始写入新的 ZIP 文件条目并将流定位到条目数据的开头。如果仍处于活动状态,则关闭当前条目。
// 这里的ZipEntry就是一个条目
 
// 条目类:ZipEntry(表示 ZIP 文件条目)
public void putNextEntry(ZipEntry e) throws IOException {}

2.

// 关闭当前 ZIP 条目并定位流以写入下一个条目
 public void closeEntry() throws IOException {}

ZipOutputStream可以把多份数据写入zip包

先创建一个ZipOutputStream对象,从中包装一个FileOutputStream流,然后每写入一个文件(条目类),先调用putNextEntry(),然后write()写入byte[]数据,写入完毕后调用closeEntry()方法结束这个文件的打包。

具体实现代码如下:

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.file.Files;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
/**
 * 将指定文件写入zip文件
 */
public class Demo02 {
    public static void main(String[] args) {
        // 原始目录
        File rootDir = new File("d:\\IOTest\\tuji");
        // 将原始目录中的文件,“写入”zip压缩文件
        try (ZipOutputStream out = new ZipOutputStream(new FileOutputStream(rootDir.getParent() + "\\" + rootDir.getName() + ".zip"))) {
            // 获取并遍历原始目录下的子文件列表
            File[] files = rootDir.listFiles();
            // 循环写入每一个文件
            for (File f : files) {
                // 创建一个ZipEntry
                out.putNextEntry(new ZipEntry(f.getName()));
                // 将源文件的字节内容,写入zip压缩包
                out.write(Files.readAllBytes(f.toPath()));
                // 结束当前zipEntry
                out.closeEntry();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

到此这篇关于Java Zip文件读写操作详解的文章就介绍到这了,更多相关Java Zip文件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java超过long类型的数据表示方法

    Java超过long类型的数据表示方法

    这篇文章主要给大家介绍Java超过long类型的数据如何表示,在 Java 中,如果需要表示超过 long 类型范围的数据,可以使用 BigInteger 类,BigInteger 是 Java 提供的一个用于处理任意精度整数的类,它可以表示非常大或非常小的整数,需要的朋友可以参考下
    2023-09-09
  • JavaWeb开发基于ssm的校园服务系统(实例详解)

    JavaWeb开发基于ssm的校园服务系统(实例详解)

    这篇文章主要介绍了JavaWeb开发基于ssm的校园服务系统,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02
  • Android token过期刷新处理的方法示例

    Android token过期刷新处理的方法示例

    这篇文章主要介绍了Android token过期刷新处理的方法示例,本文详细的介绍了2种方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-10-10
  • Java设计模式中的代理设计模式详细解析

    Java设计模式中的代理设计模式详细解析

    这篇文章主要介绍了Java设计模式中的代理设计模式详细解析,代理模式,重要的在于代理二字,何为代理,我们可以联想到生活中的例子,比如秘书、中介这类职业,我们可以委托中介去帮我们完成某些事情,而我们自己只需要关注我们必须完成的事情,需要的朋友可以参考下
    2023-12-12
  • Java编程调用微信分享功能示例

    Java编程调用微信分享功能示例

    这篇文章主要介绍了Java编程调用微信分享功能,结合实例形式分析了java微信分享功能接口的定义与调用相关操作技巧,需要的朋友可以参考下
    2017-08-08
  • 使用java实现telnet-client工具分享

    使用java实现telnet-client工具分享

    这篇文章主要介绍了使用java实现telnet-client工具,需要的朋友可以参考下
    2014-03-03
  • Java实现简单的贪吃蛇小游戏

    Java实现简单的贪吃蛇小游戏

    这篇文章主要为大家详细介绍了Java实现简单的贪吃蛇小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-04-04
  • java原装代码完成pdf在线预览和pdf打印及下载

    java原装代码完成pdf在线预览和pdf打印及下载

    本文主要介绍了java原装代码完成pdf在线预览和pdf打印及下载的方法,具有一定的参考价值,下面跟着小编一起来看下吧
    2017-02-02
  • Java使用SFTP上传文件到服务器的简单使用

    Java使用SFTP上传文件到服务器的简单使用

    这篇文章主要介绍了Java使用SFTP上传文件到服务器的简单使用,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-02-02
  • java 运行报错has been compiled by a more recent version of the Java Runtime

    java 运行报错has been compiled by a more recent version of the J

    java 运行报错has been compiled by a more recent version of the Java Runtime (class file version 54.0)
    2021-04-04

最新评论