文章目录
- 前言
- 一、ZIP压缩输入流是什么?
- 二、使用介绍
- 1.使用方法
- 2.实操展示
- 总结
前言
该篇文章将会介绍如何使用java代码将各种文件(文件夹)的资源压缩为一个ZIP压缩包。通过java.util包中的ZipOutputStream类来实现。并且需要自定义压缩方法,分别创建两个文件对象参数,一个为被压缩的文件,另一个为压缩包文件对象。需要压缩包对象套入文件输入流FileOutputStream流对象,可以被输入数据。文件输入流对象套入压缩流对象,可以被执行压缩的一系列操作。具体如何实现的,看下面的文章展示。
一、ZIP压缩输入流是什么?
Zip压缩输入流是指将数据压缩为Zip格式的输入流。ZIP压缩管理文件是一种十分经典的文件压缩形式,使用它可以节约存储空间。对于ZIP压缩的I/O实现,使用java.util.zip包中的ZipOutputStream与ZipInputStream类来实现文件的压缩/解压缩。
二、使用介绍
1.使用方法
(1)构造方式:
new ZipOutputStream(OutputStream out);
(2)常用方法:
方法 | 功能描述 |
putNextEntry(ZipEntry e) | 开始写入一个新的ZipEntry(压缩条目)到压缩文件中 |
write(byte[] b,int off,int len) | 将字节数组数据写入当前ZIP条目 |
finish() | 完成写入ZIP输出流的内容。在调用finish()方法之后,应该调用close()方法来释放资源 |
setComment(String comment) | 可设置此ZIP文件的注释文字 |
closeEntry() | 关闭ZIP条目(即文件或文件夹) |
问题:closeEntry()对比finish()和close()方法有什么区别?
在Java中,
closeEntry()
是用于关闭当前的ZIP条目的方法,主要用于处理ZIP文件的输入流。而finish()
和close()
方法则是用于处理输出流。具体区别如下:
closeEntry()
方法是ZipInputStream类的方法,用于关闭当前的ZIP条目,以便读取下一个ZIP条目。finish()
方法是ZipOutputStream类的方法,用于结束ZIP文件的写入操作,并关闭输出流。close()
方法是InputStream和OutputStream类的方法,用于关闭输入流和输出流。
2.实操展示
代码如下(示例):
import java.io.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
public class Demo{
/*
* @被压缩的文件对象
* @压缩包文件对象
*/
static void compress(File source,File target){ //压缩方法
try (FileOutputStream fis = new FileOutputStream(target);
ZipOutputStream zos = new ZipOutputStream(fis)){
if(source.isDirectory()){
for(File f:source.listFiles()){
addEntry(zos,f,"");
}
}else{
addEntry(zos, source,"");
}
} catch (Exception e) {
e.printStackTrace();
}
}
/*
* @压缩流对象
* @被压缩文件对象
* @被压缩文件的路径
*/
static void addEntry(ZipOutputStream zos,File source,String base){ //实际上的压缩操作和添加条目
if(source.isDirectory()){ //使用了递归的方法
for(File file:source.listFiles()){
addEntry(zos,file,base+source.getName()+File.separator);
}
}else{//实际写入条目操作
byte buf[]=new byte[1024];
try (FileInputStream fis = new FileInputStream(source)){
int count = -1;
//在压缩包中添加新条目
zos.putNextEntry(new ZipEntry(base+source.getName()));
while((count = fis.read(buf))!=-1){
zos.write(buf,0, count);
zos.flush();
}
zos.closeEntry(); //关闭条目
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
compress(new File("D:\\word\\"), new File("D:/word.zip"));
}
}
被压缩的文件夹所包含的文件
运行结果:
第一,值得注意的是,使用java压缩文件时,要进行一项操作,“添加条目”,所谓的条目就是压缩包中一条一条的文件(或文件夹),如下图所示:
test文件夹和word.txt文件在这个压缩包中各自占据一个条目。
"添加条目"这个操作有三个步骤:
(1)创建一行条目,使用putNextEntry(ZipEntry e),压缩包中显示这一行的文件(夹)。
(2)压缩流将从被压缩文件读出的数据写入该条目(while循环读取压缩文件),直到读完。
(3)关闭该行条目。
第二,以上示例采用了递归的方法,在自定义方法addEntry()中若被压缩文件是文件夹,将再次调用addEntry()方法,改变方法上的压缩文件路径参数,即base+source.getName()+File.separator。(File.separator为"\",表示该文件夹在压缩包中的路径,文件夹中的文件都会压缩在这条路径中)
第三, 该示例写的两个自定义方法可以看为一个表子,一个里子。compress()方法实际上创建了一个空的zip文件。compress()中调用addEntry()方法才是实质上将被压缩文件的数据写入到zip文件里
第四,addEntry()方法中一开始引入空的String base被压缩文件路径,是为了在处理压缩一层或多次文件夹时,递归调用自身方法时,不断更新被压缩文件的正确路径。这是为了应对复杂的文件文件夹关系。
总结
以上就是如何使用java压缩各种文件和文件夹的内容了,本文仅仅简单介绍了压缩流的使用,而ZipOutputStream提供了强大的功能仍需要我们在实践中不断的学习和积累经验,有拓展或指正的内容欢迎在评论区中留言。