java 项目总是有上传 zip 包和下载 zip 包的需求,这时就得用 ZipInputStream 和 ZipOutputStream 类。
基础概念
- ZipOutputStream:是一种 FilterInputStream 、装饰器模式中的实现类,它可以直接读取zip 包的内容
- ZipOutputStream (OutputStream out):zip 输出流
- ZipEntry(String name):表示压缩文件中的一个文件或者目录
- void putNextEntry(ZipEntry e):写入新的压缩文件或者目录
- ZipIutputStream:是一种 FilterOutputStream, 可以实现 zip 文件的解压
- ZipIutputStream (IutputStream out):zip 输入流
- ZipEntry getNextEntry():得到压缩文件中的一个文件或者目录
压缩
压缩文件就是先读取一个文件夹的内容,创建 ZipEntry 放入 ZipOutputStream 下,然后用 InputStream 读取源文件内容并写入 ZipOutputStream。
/**
* 压缩文件
* @param sourceFilePath 待压缩的文件路径
* @param zipFilePath 压缩后存放路径
* @return
*/
public static void zip(String sourceFilePath, String zipFilePath) {
File sourceFile = new File(sourceFilePath);
if (!sourceFile.exists()) {
System.out.println(sourceFilePath + " 不存在");
return;
}
File zipFile = new File(zipFilePath);
if (zipFile.exists()) {
System.out.println(zipFilePath + " 已经存在");
return;
}
try {
byte[] buffer = new byte[1024];
try (ZipOutputStream zos = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(zipFile)))){
for(File file: sourceFile.listFiles()) {
// 创建 ZIP 中的文件,并添加进压缩包
ZipEntry zipEntry = new ZipEntry(file.getName());
zos.putNextEntry(zipEntry);
// 读取待压缩的文件并写进压缩包里
try (InputStream bis = new BufferedInputStream(new FileInputStream(file))){
int read = 0;
while ((read = bis.read(buffer)) != -1) {
zos.write(buffer, 0, read);
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
解压
一个压缩文件就是一个特殊的 File 叫做 ZipFile,用 Enumeration 类取出 zip 文件中被压缩的文件。
List< String > fileNames=new ArrayList< >();
try{
ZipFile zipFile=new ZipFile(path, Charset.forName("gbk"));
Enumeration< ? extends ZipEntry > entries = zipFile.entries();
while(entries.hasMoreElements()){
String fileName=entries.nextElement().getName();
fileNames.add(fileName);
System.out.println("文件名称: "+fileName);
}
}catch (Exception e){
e.printStackTrace();
}
解压文件 就是先用 zipFile.entries() 读取压缩文件夹中的文件, 生成 InputStream 流后写入被解压的 输出流
/**
* 解压
* @param zipPath zip 文件夹路径
* @param targetPath 解压路径
*/
public static void unzip(String zipPath,String targetPath){
File pathFile = new File(targetPath);
if(!pathFile.exists()){
pathFile.mkdirs();
}
try{
//指定编码
try(ZipFile zipFile = new ZipFile(zipPath, Charset.forName("gbk"))) {
//遍历里面的文件及文件夹
Enumeration entries = zipFile.entries();
while (entries.hasMoreElements()) {
ZipEntry entry = (ZipEntry) entries.nextElement();
String zipEntryName = entry.getName();
try (InputStream in = zipFile.getInputStream(entry)) {
String outpath = (targetPath + File.separator + zipEntryName);
//判断路径是否存在,不存在则创建文件路径
File file = new File(outpath.substring(0, outpath.lastIndexOf(File.separator)));
if (!file.exists()) {
file.mkdirs();
}
//判断文件全路径是否为文件夹
if (new File(outpath).isDirectory())
continue;
try (OutputStream out = new FileOutputStream(outpath)) {
byte[] buffer = new byte[1024];
int len;
while ((len = in.read(buffer)) > 0) {
out.write(buffer, 0, len);
}
}
}
}
}
}catch ( Exception e){
e.printStackTrace();
}
}
总结
介绍了一下 java 中的压缩文件是如何解压与压缩的,对小伙伴们有帮助的话就点个赞哦。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
JAVA
+关注
关注
19文章
2967浏览量
104716 -
Zip
+关注
关注
0文章
17浏览量
8638 -
压缩
+关注
关注
2文章
102浏览量
19375 -
文件
+关注
关注
1文章
565浏览量
24734
发布评论请先 登录
相关推荐
如何在Linux使用unzip命令在终端解压缩文件
ZIP是最广泛使用的存档文件格式,支持无损数据压缩。ZIP文件是一个数据容器,其中包含一个或多个压缩文件或目录。
发表于 12-08 16:52
•4797次阅读
WinRAR压缩文件我们该知道的几个点【jiasuba】
真正做到事半功倍。1.制作自解压文件 如果你平时使用Win7系统下载的WinRAR来压缩文件,而你的朋友也不会使用WinRAR,但你的数据又确实必须压缩后才能够给他。这时,我们就可以
发表于 03-14 09:47
压缩文件可以使用pdf压缩器吗
` 压缩文件可以使用pdf压缩器吗?现在很多办公人员都会编辑各种文档格式的文件,也都掌握了将其它可编辑格式转换为PDF文件格式的方法,但是有时候PDF
发表于 10-27 14:03
解读Linux :先从创建一个文件夹用来存放jdk压缩文件开始
1 创建一个文件夹用来存放jdk压缩文件mkdir /home/test/tar2 把下载好的jdk压缩文件上传到linux对应目录3 创建jdk解压目录mkdir /usr/loca
发表于 07-04 08:06
在 Linux 上压缩文件的 5 种方法
在 Linux 上压缩文件的 5 种方法 在 Linux 系统上有很多可以用于压缩文件的工具,但它们的表现并不都是一样的,也不是所有的压缩效果都是一样的。在这篇文章中,我们比较其中的
发表于 05-07 15:25
使用Python对压缩文件的处理
zipfile是Python里用来做zip格式编码的压缩和解压缩的module,zipfile里有两个非常重要的class:ZipFile和ZipInfo。ZipFile是主要的类,用来创建和读取zip文件,而ZipInfo是存
如何在Linux上使用Pigz来更快地压缩文件
Pigz是一款快速压缩文件的工具,它能够使用多个CPU核心进行压缩,使得压缩速度得到了极大的提升。在本文中,我们将介绍如何在Linux上使用Pigz来更快地压缩文件。
评论