JAVA--通过代码实现文件(夹)的压缩与解压(zip&rar)

 在实际的软件开发中,经常需要对文件进行打包和压缩,以便于存储和传输。Java 提供了压缩和解压缩 ZIP 文件的功能,本文将介绍如何使用 Java 来进行 ZIP 文件的压缩操作。

1. 什么是 ZIP 文件
ZIP 文件是一种常见的归档文件格式,它可以将多个文件或目录进行打包和压缩,以便于在网络传输或存储时减小文件大小。ZIP 文件格式还支持密码保护和压缩级别的设置,因此被广泛应用于文件备份、数据传输等场景。

2. Java 中的 ZIP 文件压缩
Java 提供了 java.util.zip 包来进行 ZIP 文件的压缩和解压缩操作。以下是在 Java 中进行 ZIP 文件压缩的基本步骤:

2.1 创建 ZIP 输出流
首先,需要创建一个 ZipOutputStream 对象来写入压缩后的文件内容:

2.2 添加文件至 ZIP 文件

在创建 ZIP 输出流后,可以通过下面的代码将文件添加到 ZIP 文件中:

上述示例代码中,我们创建了一个 ZipEntry 对象来表示要添加的文件,在 ZipOutputStream 中使用 putNextEntry 方法来指定要添加的文件条目,然后通过 Files.copy 方法将文件内容写入 ZIP 输出流。

2.3 关闭 ZIP 输出流
最后,需要关闭 ZIP 输出流以确保数据被正确写入:

3. 完整示例

下面是一个完整的示例代码,演示了如何使用 Java 来进行 ZIP 文件的压缩操作

在Java开发中,经常会遇到需要对文件和文件夹进行压缩和解压缩的需求。Java提供了Zip压缩库,使我们能够轻松地进行文件和文件夹的压缩操作。本文将详细介绍Java中的Zip压缩功能,并提供示例代码来演示其用法

在计算机编程中,文件的压缩和解压缩是一项常见的任务。它不仅可以节省存储空间,还可以提高文件传输的效率。Java作为一种广泛使用的编程语言,提供了丰富的API来处理这种任务。在这篇文章中,我们将探讨如何在Java中使用压缩流和解压缩流来实现文件和文件夹的压缩与解压缩。

 压缩文件(夹)

zip文件的压缩

Zip压缩是一种常见的文件压缩格式,它将多个文件和文件夹打包成一个以.zip为后缀的压缩包。压缩后的文件可以减小存储空间和网络传输的大小,并方便地进行传输和共享。Java的Zip压缩库提供了一组API,用于创建、读取和解压缩Zip文件

在进行文件压缩之前,我们需要先创建一个Zip文件。可以使用ZipOutputStream类来创建一个新的Zip文件,并指定文件名。以下是创建压缩文件的示例代码:

在上面的示例中,我们首先创建了一个ZipOutputStream对象,并传入一个FileOutputStream用于写入Zip文件。然后,我们通过调用addToZipFile()方法将需要压缩的文件添加到Zip文件中。

在addToZipFile()方法中,我们创建了一个ZipEntry对象,设置文件名,并将其添加到Zip输出流中。接下来,我们可以将文件内容写入Zip文件,并通过调用closeEntry()方法完成当前文件的压缩。

在上面的示例中,我们定义了一个compressFolder()方法,用于递归地压缩文件夹。该方法接受源文件夹路径、当前文件夹路径和Zip输出流作为参数。

在方法中,我们首先列出文件夹中的所有文件和子文件夹,然后对每个文件和子文件夹进行处理。如果是子文件夹,我们递归调用compressFolder()方法来压缩子文件夹。如果是文件,我们调用addToZipFile()方法将文件添加到Zip文件中。

1)、引入库
2)、创建File对象表示要压缩的文件和压缩包的位置
3)、定义一个方法用来文件压缩

1、创建压缩流关联压缩包,创建ZipEntry对象,表示压缩包里面的文件,然后把ZipEntry对象放到压缩包当中,到这里相当于已经把压缩包中的框架搭好了

2.把文件中的数据写到压缩包中

rar文件的压缩

解压读取文件(夹)

解压的本质:把压缩包里面的每一个文件或者文件夹读取出来,按照层级拷贝到目的地中。

Java的Zip压缩库不仅可以用于压缩文件,还可以用于解压缩已有的Zip文件。下面我们将学习如何使用Java的Zip压缩库来解压缩文件。

zip文件的解压与读取

要解压缩一个Zip文件,我们需要读取Zip文件的内容,并将其解压到指定的目录。以下是解压缩文件的示例代码:

在上面的示例中,我们首先创建一个ZipInputStream对象,并传入一个FileInputStream来读取Zip文件。然后,我们调用unzipFiles()方法来解压缩文件。

在unzipFiles()方法中,我们使用循环逐个读取Zip文件中的条目。如果条目是一个文件夹,我们创建相应的文件夹。如果是一个文件,我们创建该文件并将Zip条目的内容写入该文件。

引入库
2)、创建File表示要解压的压缩包以及解压到的目标位置
3)、定义一个方法用来解压缩

1、创建一个解压缩流用来读取压缩包中的数据,获取到压缩包里面的每一个zipentry对象,如果获取到文件或者文件夹,解压缩流获取的结果就不是null,否则为null。

2.如果entry不是null,则判断是否为文件夹,如果是文件夹,则需要在目的地创建一个同样的文件夹,如果是文件,则需要读取压缩包中的文件,并把他存到目的地文件夹中(按照层级目录存放)。
注意:在每次文件处理完毕后,需要调用一次压缩流中的closeEntry()方法。

rar文件的解压与读取

总结

通过本文,我们学习了如何使用Java的Zip压缩库来压缩和解压缩文件。我们学习了如何创建压缩文件、压缩多个文件、压缩文件夹以及解压缩文件。Zip压缩是Java开发中常用的文件操作之一,能够简化文件和文件夹的压缩和解压缩操作。掌握Zip压缩功能将为你处理文件相关的任务提供便利和效率。

希望本文对你理解和使用Java的Zip压缩库有所帮助。通过实践和探索,你可以进一步扩展Zip压缩的功能,满足更复杂的需求。

感谢阅读本文,希望你能从中获得有价值的知识和经验!祝你在Java开发中取得成功!

总的来说,压缩与解压缩的大致思想相似,都是对目标文件进行遍历然后判断,压缩主要是先搭建好框架再进行数据的填充,解压缩与文件夹拷贝思路类似

package s202407;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Arrays;

//IO
//Input:输入,通过“输入流”进行文件的读取操作
//Output;输入,通过“输入流”进行文件的读取操作

//输入流:InputStream
public class s0711 {
	public static void main(String[] args) {
	
		try {
			//创建输入流
			@SuppressWarnings("resource")
			FileInputStream in = new FileInputStream(
"E:\\LenovoSoftstore\\Install\\aiqiyi\\LStyle\\12.6.5.8412\\skin\\player-control.zip");
			
//			//每次读取一个字节
//			int data = -1;
//			while((data = in.read())  != -1) {
//				System.out.println(data);
//			}
			
			//每次读取128个字节
			byte[] buff = new byte[128];
			int len = 0;
			while((len = in.read(buff)) != -1) {
				System.out.printf("本次读取到%d个字符: %s\n",len,Arrays.toString(buff));
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
package s202407;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

import org.apache.commons.io.FileUtils;

public class s071102 {
	public static void main(String[] args) {
		String path = "C:\\Users\\lenovo\\Desktop\\easyftp-server-1.7.0.10-cn.zip";
		//String path = "C:\\Users\\lenovo\\Desktop\\easyftp-server-1.7.0.10-cn.zip";
		
		if(path.endsWith(".zip")) {
			unzip(path);
		}else {
			unrar(path);
		}
		
	}
	//解压缩rar格式
	private static void unrar(String path) {
		
		
	}
	
	//解压缩zip格式
	private static void unzip(String path) {
		//更据原始路径(字符串),创建源文件(File对象)
		File sourceFile = new File(path);
		
		//根目录
		String sourceFileName = sourceFile.getName();
		File rootDir = new File(sourceFile.getParent()+"\\"+sourceFileName.substring(0,sourceFileName.lastIndexOf(".")));
		
		//判断根目录是否已存在
		if(rootDir.exists()) {
			//如果存在则删除
			//rootDir.delete();//仅能删除空目录
			
			//使用commons-io包提供的FileUtiles工具类进行删除
			try {
				FileUtils.delete(rootDir);
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		
		//创建根目录
		rootDir.mkdir();
		
		//ZipInputStream:用于进行zip格式的压缩文件输入流
		try(ZipInputStream in = new ZipInputStream(new FileInputStream(sourceFile))){
			
			//遍历压缩包中的每个子目录或子文件(ZipEntry类型的对象)
			//ZipEntry表示实体(及每一个目录和文件)
			ZipEntry zipEntry = null;
			while((zipEntry = in.getNextEntry()) != null) {
				
				//读取目录文件名
				System.out.println(zipEntry.getName());
				
				//创建子目录或子文件(file对象)
				
				//获取文件地址
				File file = new File(rootDir.getPath()+"\\"+zipEntry.getName());
				//创建
				if(zipEntry.isDirectory()) {
					//物理磁盘创建子目录
					file.mkdir();
				}else {
					物理磁盘创建子文件
					file.mkdir();
					
					//读取当前压缩包中的子文件,并通过输出流out写入新子文件中
					try(FileOutputStream out = new FileOutputStream(file);){
						byte[] buff = new byte[1024];
						int len = -1;
						while((len = in.read(buff)) != -1) {
							out.write(buff,0,len);
						}
					}
				}
				
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值