一、简述

  解压技术和压缩技术正好相反,解压技术要用到的类:由ZipInputStream通过read方法对数据解压,同时需要通过CheckedInputStream设置冗余校验码,如:

CheckedInputStream cis = new CheckedInputStream(new FileInputStream(
srcFile), new CRC32()); ZipInputStream zis = new ZipInputStream(cis);

  需要注意的是,在构建解压文件时,需要考虑目录的自动创建,这里通过递归方式逐层创建父目录,如下所示:

//当父目录不存在时,创建目录! 
private static void fileProber(File dirFile) {
File parentFile = dirFile.getParentFile();
if (!parentFile.exists()) { // 递归寻找上级目录
fileProber(parentFile);
parentFile.mkdir();
}
}

在压缩的时候,我们是将一个一个文件作为压缩添加项(ZipEntry)添加至压缩包中,解压缩就要将一个一个压缩项从压缩包中提取出来,如下所示:

private static void decompress(File destFile, ZipInputStream zis)  throws Exception {
ZipEntry entry = null;
while ((entry = zis.getNextEntry()) != null) { // 文件
String dir = destFile.getPath() + File.separator + entry.getName(); File dirFile = new File(dir); // 文件检查
fileProber(dirFile); if (entry.isDirectory()){
dirFile.mkdirs();
} else {
decompressFile(dirFile, zis);
}
zis.closeEntry();
}
}

最核心的解压缩实现,其实与压缩实现非常相似,代码如下所示:

/**
* 文件解压缩
*
* @param destFile
* 目标文件
* @param zis
* ZipInputStream
* @throws Exception
*/
private static void decompressFile(File destFile, ZipInputStream zis)
throws Exception { BufferedOutputStream bos = new BufferedOutputStream(
new FileOutputStream(destFile)); int count;
byte data[] = new byte[BUFFER];
while ((count = zis.read(data, , BUFFER)) != -) {
bos.write(data, , count);
}
bos.close();
}

完整的例子:

package com.joyplus.test;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.zip.CRC32;
import java.util.zip.CheckedInputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream; /**
*
* @author
*
*/
public class zipFiletest2 {
public static final String EXT = ".zip";
private static final String BASE_DIR = "";
private static final String PATH = File.separator;
private static final int BUFFER = 1024; /**
* 文件 解压缩
*
* @param srcPath
* 源文件路径
*
* @throws Exception
*/
public static void decompress(String srcPath) throws Exception {
File srcFile = new File(srcPath); decompress(srcFile);
} /**
* 解压缩
*
* @param srcFile
* @throws Exception
*/
public static void decompress(File srcFile) throws Exception {
String basePath = srcFile.getParent();
decompress(srcFile, basePath);
} /**
* 解压缩
*
* @param srcFile
* @param destFile
* @throws Exception
*/
public static void decompress(File srcFile, File destFile) throws Exception { CheckedInputStream cis = new CheckedInputStream(new FileInputStream(
srcFile), new CRC32()); ZipInputStream zis = new ZipInputStream(cis); decompress(destFile, zis); zis.close(); } /**
* 解压缩
*
* @param srcFile
* @param destPath
* @throws Exception
*/
public static void decompress(File srcFile, String destPath)
throws Exception {
decompress(srcFile, new File(destPath)); } /**
* 文件 解压缩
*
* @param srcPath
* 源文件路径
* @param destPath
* 目标文件路径
* @throws Exception
*/
public static void decompress(String srcPath, String destPath)
throws Exception { File srcFile = new File(srcPath);
decompress(srcFile, destPath);
} /**
* 文件 解压缩
*
* @param destFile
* 目标文件
* @param zis
* ZipInputStream
* @throws Exception
*/
private static void decompress(File destFile, ZipInputStream zis)
throws Exception { ZipEntry entry = null;
while ((entry = zis.getNextEntry()) != null) { // 文件
String dir = destFile.getPath() + File.separator + entry.getName(); File dirFile = new File(dir); // 文件检查
fileProber(dirFile); if (entry.isDirectory()) {
dirFile.mkdirs();
} else {
decompressFile(dirFile, zis);
} zis.closeEntry();
}
} /**
* 文件探针
*
*
* 当父目录不存在时,创建目录!
*
*
* @param dirFile
*/
private static void fileProber(File dirFile) { File parentFile = dirFile.getParentFile();
if (!parentFile.exists()) { // 递归寻找上级目录
fileProber(parentFile); parentFile.mkdir();
} } /**
* 文件解压缩
*
* @param destFile
* 目标文件
* @param zis
* ZipInputStream
* @throws Exception
*/
private static void decompressFile(File destFile, ZipInputStream zis)
throws Exception { BufferedOutputStream bos = new BufferedOutputStream(
new FileOutputStream(destFile)); int count;
byte data[] = new byte[BUFFER];
while ((count = zis.read(data, 0, BUFFER)) != -1) {
bos.write(data, 0, count);
} bos.close();
}
public static void main(String[] args) {
// 解压到指定目录
try {
zipFiletest2.decompress("D:\\sumZip\\co.zip", "D:\\log");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }
}

  

参考文章:http://snowolf.iteye.com/blog/642492

java.util.zip压缩打包文件总结二: ZIP解压技术的更多相关文章

  1. java.util.zip压缩打包文件总结一:压缩文件及文件下面的文件夹

    一.简述 zip用于压缩和解压文件.使用到的类有:ZipEntry  ZipOutputStream 二.具体实现代码 package com.joyplus.test; import java.io ...

  2. python用zipfile模块打包文件或是目录、解压zip文件实例

    #!/usr/bin/env python # -*- coding: utf-8 -*- from zipfile import * import zipfile #解压zip文件 def unzi ...

  3. Linux tar (打包.压缩.解压缩)命令说明 | tar如何解压文件到指定的目录?

    打包举例:将 /usr/local/src/zlib-1.2.5目录下的文件打包成 zlib-1.2.5.tar.gz cd /usr/local/src tar -czvf ./zlib-1.2.5 ...

  4. java jar包解析:打包文件,引入文件

    java jar包解析:打包文件,引入文件 cmd下: jar命令:package包打包 javac命令:普通类文件打包 Hello.java: package org.lxh.demo; publi ...

  5. php读取excel,以及php打包文件夹为zip文件

    1.把文件下载到本地,放在在Apache环境下2.d.xlsx是某游戏的服务器名和玩家列表,本程序只适合此种xlsx文件结构,其他结构请修改index.php源码3.访问zip.php的功能是把生成的 ...

  6. java打包文件夹为zip文件

    //待压缩的文件目录 String sourceFile=sourceFilePath+"\\"+userName; //存放压缩文件的目录 String zipFilePath ...

  7. PHP实现zip压缩打包下载

    先来看PHP实现文件及文件夹的zip压缩 这里使用PHP扩展的ZipArchive类,在使用之前要将php.ini文件中的zlib.output_compression设置为On 代码如下: publ ...

  8. [转]C#压缩打包文件

    /// <summary> /// 压缩和解压文件 /// </summary> public class ZipClass { /// <summary> /// ...

  9. asp.net C#压缩打包文件例子

    /// <summary> /// 压缩和解压文件 /// </summary> public class ZipClass { /// <summary> /// ...

随机推荐

  1. sudo easy_install MySQL-pythonubuntu常用命令

    修改密码 sudo passwd root 安装openssh-server sudo apt-get install openssh-server 安装easy_install sudo wget ...

  2. ARM学习笔记7——乘法指令

    ARM乘法指令完成两个数据的乘法,两个32位二进制数相乘的结果是64位的4积. 其中: 1.“RadHi:RdLo”是由RdHi(最高有效32位)和RdLo(最低有效32位)链接形成的64位数,“[3 ...

  3. LRU 缓冲池 (不考虑多线程)

    lru:(转)LRU算法的实现 什么是LRU算法? LRU是Least Recently Used的缩写,即最近最少使用页面置换算法,是为虚拟页式存储管理服务的.关于操作系统的内存管理,如何节省利用容 ...

  4. 2013 ACM区域赛长沙 A Alice’s Print Service HDU 4791

    题意:就是一个打印分段收费政策,印的越多,单张价格越低,输入需要印刷的数量,求最小印刷费用一个细节就是,比当前还小的状态可能是最后几个. #include<stdio.h> #includ ...

  5. GCC内联汇编入门

    原文为GCC-Inline-Assembly-HOWTO,在google上可以找到原文,欢迎指出翻译错误. 中文版说明 由于译者水平有限,故译文出错之处,还请见谅.C语言的关键字不译,一些单词或词组( ...

  6. Yii PHP 框架分析(四)

    作者:wdy http://hi.baidu.com/delphiss/blog/item/c15b314f05f9dfc0d0c86a26.html Yii应用的入口脚本最后一句启动了WebAppl ...

  7. 《神经网络和深度学习》系列文章三:sigmoid神经元

    出处: Michael Nielsen的<Neural Network and Deep Leraning>,点击末尾“阅读原文”即可查看英文原文. 本节译者:哈工大SCIR硕士生 徐伟 ...

  8. poj 3608 Bridge Across Islands

    题目:计算两个不相交凸多边形间的最小距离. 分析:计算几何.凸包.旋转卡壳.分别求出凸包,利用旋转卡壳求出对踵点对,枚举距离即可. 注意:1.利用向量法判断旋转,而不是计算角度:避免精度问题和TLE. ...

  9. FZU 2129 子序列个数 (动态规划)

    题意:子序列的定义:对于一个序列a=a[1],a[2],......a[n].则非空序列a'=a[p1],a[p2]......a[pm]为a的一个子序列,其中1<=p1<p2<.. ...

  10. java 递归函数

    一.递归函数,通俗的说就是函数本身自己调用自己...  如:n!=n(n-1)!  你定义函数f(n)=nf(n-1)  而f(n-1)又是这个定义的函数..这就是递归  二.为什么要用递归:递归的目 ...