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 文件