Zip文件的读取和写入

本文介绍了如何在Java中使用ZipInputStream和ZipOutputStream进行Zip文件的读取和写入。通过创建ZipInputStream从FileInputStream读取zip内容,循环调用getNextEntry()进行解压。而写入zip文件则涉及ZipOutputStream,配合FileOutputStream,通过putNextEntry()、write()和closeEntry()完成文件打包过程。

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

在Java中,我们可以直接来读取压缩包(zip包),ZipInputStream就可以直接读取zip包的内容,接下来,我们就来看看zip包的读取和写入。

首先,我们先来看看zip文件的读取,我们在读取zip文件时,首先应该创建一个ZipInputStream,它也是一种FilterInputStream类,我们在创建好ZipInputStream后,通常会传入一个FileInputStream作为数据源,然后,循环调用getNextEntry(),直到返回null,表示zip流结束。

zip文件的读取代码如下:

package com.hpc.wyj04;

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 Decorator02 {
	public static void main(String[] args) {
		
		try (ZipInputStream in = new ZipInputStream(
				new FileInputStream("e:\\button.zip")
                                  ,Charset.forName("gbk"))) {
			ZipEntry zip=null;
			//获取压缩文件中的每个子文件
			while((zip=in.getNextEntry())!=null) {
				System.out.println(zip.getName());
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}

既然Java可以直接读取zip文件,我们就可以利用Java程序来进行一个解压缩包的操作,我们只需要在读取zip文件的基础上加上写入的目录和具体的文件即可,具体实现代码如下:

package com.hpc.wyj04;

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;

public class Decorator03 {
	public static void main(String[] args) {
		
		//要进行解压缩的zip文件
		File zipFile=new File(
				"C:\\Users\\我\\Documents\\Tencent Files\\464822504\\FileRecv\\1-201023201325.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;

				//输出流定义在try()块,结束自动清空缓冲区并关闭
				try(BufferedOutputStream bos=new BufferedOutputStream(
                                         new FileOutputStream(zipFilePath))){
					
					//读取该子文件的字节内容
					byte[] buff=new byte[1024];
					int len=-1;
					while((len=in.read(buff))!=-1) {
						bos.write(buff);
					}
				} 
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

接下来,我们来看看将指定文件写入zip文件,和zip文件的读取类似,我们首先需要创建一个ZipOutputStream,通常是包装一个FileOutputStream,然后,每写入一个文件前,先调用putNextEntry(),然后用write()写入byte[ ]数据,写入完毕后调用closeEntry()结束这个文件的打包。

具体实现代码如下:

package com.hpc.wyj04;

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文件
 * @author 我
 *
 */
public class Decorator04 {
	public static void main(String[] args) {
		
		//原始目录
		File file=new File("D:\\360安全浏览器下载\\advise\\css");
		
		//将原始目录中的文件,”写入“zip压缩文件
		try (ZipOutputStream out = new ZipOutputStream(
				                      new FileOutputStream( 
                             file.getParent()+"\\"+file.getName()+".zip"))) {
			
			//获取并遍历原始目录下的子文件列表
			File[] files=file.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();
		}
	}

}

ZipOutputStream可以把多份数据写入zip包; 配合FileInputStream和FileOutputStream就可以读写zip文件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值