操作Zip压缩文件流的用法总结

本文详细介绍了如何使用ZipInputStream读取zip文件并解压缩,以及ZipOutputStream如何将文件写入zip包。通过案例演示了Java操作zip文件的全过程,适合初学者和进阶者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.概述

ZipInputStream是一种FilterInputStream,它可以直接读取zip包的内容:

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

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

2.ZipInputStream的基本用法:用来读取zip包

      首先要创建一个ZipInputStream,通常是传入一个FileInputStream作为数据源,然后,循环调用getNextEntry(),直到返回null,表示zip流结束;
      一个ZipEntry表示一个压缩文件或目录,如果是压缩文件,我们就用read()方法不断读取,直到返回-1;

下面以一个综合案例演示ZipInputStream流的具体用法:

案例1:实现将指定zip压缩文件解压到当前目录

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

/**
 * 解压缩zip文件
 * 
 * @Description
 * @author tyq
 * @version
 * @date 2022-5-29 14:33:58
 *
 */
public class Demo01 {
	public static void main(String[] args) {
		// 要进行解压缩的zip文件
		File zipFile = new File("E:\\aaa.zip");
		// 1.创建解压缩目录
		// 获取zip文件目录
		String zipFileName = zipFile.getName();
		// 根据zip文件名称,提取压缩目录的名称
		String targetDirName = zipFileName.substring(0, zipFileName.indexOf('.'));
		// 创建解压缩目录
		File targetDir = new File(zipFile.getParent() + "\\" + targetDirName);
		if (!targetDir.exists()) {
			targetDir.mkdir();// 创建目录
		}
		// 2.解析读取zip文件
		try (ZipInputStream in = new ZipInputStream(new FileInputStream(zipFile), Charset.forName("gbk"))) {
			//遍历zip文件中的每个子文件
			ZipEntry zipEntry = null;
			while ((zipEntry = in.getNextEntry()) != null) {
				//获取zip压缩包中的子文件名称
				String zipEntryFileName = zipEntry.getName();
				//创建该文件的输出流
				String zipFilePath = targetDir.getPath() + "\\" + zipEntryFileName;
				BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(zipFilePath));
				//读取该文件的字节内容
				byte[] buff = new byte[1024];
				int len = -1;
				while ((len = in.read(buff)) != -1) {
					bos.write(buff, 0, len);

				}
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
//
	}

}

3.ZipOutputStream的基本用法:直接写入内容到zip包

    ZipOutputStream是一种FilterOutputStream,它可以直接写入内容到zip包。我们要先创建一个ZipOutputStream,通常是包装一个FileOutputStream,然后,每写入一个文件前,先调用putNextEntry(),然后用write()写入byte[]数据,写入完毕后调用closeEntry()结束这个文件的打包。

下面以一个综合案例演示 ZipOutputStream流的具体用法:

案例2:实现将指定文件目录压缩为zip包

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文件
 * 
 * @Description
 * @author tyq
 * @version
 * @date 2022-5-30 12:49:03
 *
 */
public class Demo02 {
	public static void main(String[] args) {
		File rootFile = new File("E:\\a");
		try (ZipOutputStream zos = new ZipOutputStream(
				new FileOutputStream(rootFile.getParent() + "\\" + rootFile.getName() + ".zip"))) {
			File[] listFiles = rootFile.listFiles();
			for (File f : listFiles) {
				zos.putNextEntry(new ZipEntry(f.getName()));
				zos.write(Files.readAllBytes(f.toPath()));
				zos.closeEntry();
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

}

4.总结

●ZipInputStream可以读取zip格式的流,ZipOutputStream可以把多份数据写入zip包;
●配合FileInputStream和FileOutputStream就可以读写zip文件;

以上是近期学习的一点点心得总结,如果对您有帮助希望您留下关注和点赞,Thanks♪(・ω・)ノ

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值