在实际的软件开发中,经常需要对文件进行打包和压缩,以便于存储和传输。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();
}
}
}