import java.util.ArrayList;
import java.util.List;
import java.util.zip.InflaterInputStream;
import java.util.zip.ZipInputStream;
//import org.apache.tools.zip.ZipFile;
* 解压Zip文件工具类
* @author zhangyongbo
public class ZipUtil {
* @param input Zip文件的流
* @throws Exception
public void upload(InputStream input,String destPath) throws Exception {
ZipInputStream zis = new ZipInputStream(input);
java.util.zip.ZipEntry entry = null;
while ((entry = zis.getNextEntry()) != null) {
// System.out.printf("条目信息: 名称%1$b, 大小%2$d, 压缩时间%3$d \n",
// entry.getName(), entry.getSize(), entry.getTime());
if (entry.isDirectory()) { // is dir
// System.out.println(entry.getName() + "是一个目录");
File f = new File(destPath + File.separator + entry.getName());
if (!f.exists())
f.mkdirs();
} else { //
byte[] data = getByte(zis); // 获取当前条目的字节数组
InputStream is = new ByteArrayInputStream(data); // 把当前条目的字节数据转换成Inputstream流
String[] names = entry.getName().split("/");
String path = destPath + File.separator;
path += join(names, File.separator);
//System.out.println(path);
File file = new File(path);
if (!file.exists()) {
file.createNewFile();
toWrite(is, file);
* 向file文件写入字节
* @param ins
* @param file
public static void toWrite(InputStream ins, File file) {
try {
OutputStream os = new FileOutputStream(file);
int bytesRead = 0;
byte[] buffer = new byte[8192];
while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) {
os.write(buffer, 0, bytesRead);
os.close();
ins.close();
} catch (Exception e) {
e.printStackTrace();
* 获取条目byte[]字节
* @param zis
* @return
public byte[] getByte(InflaterInputStream zis) {
try {
ByteArrayOutputStream bout = new ByteArrayOutputStream();
byte[] temp = new byte[1024];
byte[] buf = null;
int length = 0;
while ((length = zis.read(temp, 0, 1024)) != -1) {
bout.write(temp, 0, length);
buf = bout.toByteArray();
bout.close();
return buf;
} catch (IOException e) {
e.printStackTrace();
return null;
public static String join(Object[] o, String flag) {
StringBuffer str_buff = new StringBuffer();
for (int i = 0, len = o.length; i < len; i++) {
str_buff.append(String.valueOf(o[i]));
if (i < len - 1)
str_buff.append(flag);
return str_buff.toString();
public static void main(String[] args) throws Exception {
TestZip test = new TestZip();
String filePath = "D:\\20887212384979710156_20180701_DETAILS.zip";
// File file = new File(filePath);
InputStream input = new BufferedInputStream(new FileInputStream(filePath));
test.upload(input,"E:\\work");
转载:
https://www.cnblogs.com/chiangfai/p/5888141.html
通过上面的例子,我们知道压缩包里的是一个个
Zip
Entry对象,在
解压
时,可以遍历压缩包获取到
Zip
Entry对象。每一个
Zip
Entry对象都是一个
文件
,使用
Zip
File可以获取到每一个
Zip
Entry对象的
文件
流
;获取到
文件
流
就可以将压缩包的
文件
读出来了。在创建
Zip
Entry对象时可以指定
文件
在压缩包的位置:new
Zip
Entry(“second-dir\second-01.txt”)用
Zip
OutputStream来压缩一个
文件
夹时,要搭配
Zip
Entry来使用。
一般情况商品的图片都会有原图和缩略图,其他很多场景也会应用到,一个图片上传后,可能会保存不止一份
文件
,有的时候要保存它的缩略图,需要进行压缩处理,然后保存,也就是一个图片.最终保存了多个类似图片;
这里面有两个问题, 一 是如何做对应关系 二 是如何处理缩略图,压缩图片,使得保存的图片不模糊,不失比例
这里采用 hutool 中的图片处理类,
直接
处理,此方法是按照等比缩放的;
主要代码如下:
/*...
在操作.
zip
的压缩包时,可以用到高级
流
Zip
InputStream
和
Zip
OutputStream。.
zip
文件
中的每个
文件
夹和
文件
都是一个
Zip
Entry对象。
解压
和压缩的本质就是操作每个
Zip
Entry对象,只能操作后缀为.
zip
的
文件
。
import java.io.File
InputStream
;
import java.io.FileOutputStream;
import java.util.
zip
.
Zip
Entry;
import java.util.
zip
...
void putNextEntry(
Zip
Entry e)
开始写入新的
ZIP
文件
条目并将
流
定位到条目数据的开始处。
Zip
Entry(String name) //test/mm.jpg /test/a.t...
import java.io.ByteArray
InputStream
;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.
InputStream
;
import java.nio.file.Files;
import java.nio.file.Path;
import java.ni
import java.io.ByteArray
InputStream
;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.
InputStream
;
import java.util...
我们在有些时候,使用网站下载的
文件
,会是以
流
的方式接收,而还有些时候,原
文件
格式为压缩包
文件
,这时,我们再使用
InputStream
/OutputStream或者FileInutStram/FileOutputStream来接收或者解析的话,就无法打开下载后的压缩
文件
,那么,下载的压缩
文件
流
(压缩包
流
)怎么能打开呢?
答案很简单:使用
Zip
InputStream
/FileOutputStream方式来接
首先,我们将获取到的
InputStream
流
转换成
Zip
InputStream
然后,用
zip
Input
在后端中通过POI生成Excel
文件
流
,将输出
流
(outputStream)转为输入
流
(
inputStream
)后又需要将输入
流
(
inputStream
)转为File对象。问题:如果需要将输入
流
(
inputStream
)转为File对象,则必须要根据本地路径去生成一个File对象才行,也就是说不管怎样本地都必须要生成出来一个
文件
。看到这里你可能会好奇,这不是也在本地生成了个
文件
吗?在经过一系列的资料查询后,发现如下方式可以大致满足需求。即为我们需要的File对象。
在这个规范的代码示例中,代码在提取条目之前验证每个条目的名称。代码不要使用
Zip
Entry.getSize()方法,因为攻击者 可以伪造
ZIP
文档中未压缩的
文件
的大小。最后,代码还计算压缩包中
文件
条目的数量,如果超过 1024个条目,则抛出异常。
解压
一个
文件
,比如
zip
、gif或者 g
zip
编码的 HTTP 内容,可能会消耗过多的资源,并且在压缩率极高的情况下,可能会导 致
zip
炸弹的出现。对于从
Zip
InputStream
安全
解压
文件
的情况,示例1给出了不规范用法(Java 语言)示例。
在我们需要对
Zip
文件
作出一些相应的操作时,我们就需要使用
Zip
InputStream
类来解析以及生成
Zip
文件
,
ZIp
InputStream
是Filter
InputStream
的子类,所以可以知道他也是一个装饰器,并没有真正读取
文件
的能力,以下是
Zip
文件
解析与生成的具体方法步骤:(一)解析
Zip
文件
首先,我们要获取一个
ZIp
文件
,在创建一个
解压缩
文件
夹来存放
解压
出来的
Zip
文件
内容
然后,使用
Zip
InputStream
类对
文件
进行解析,在里面传入一个File
InputStream
来读取到
Zip
文件