java.util.zip压缩打包文件总结二: ZIP解压技术

一、简述

  解压技术和压缩技术正好相反,解压技术要用到的类:由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, 0, BUFFER)) != -1) {
        bos.write(data, 0, 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

时间: 2024-12-29 06:46:10

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

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

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

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.tar.gz ./zlib-1.2.5/* # 压缩到制定目录下(如:/root/2/ ) tar -czvf /root/2/zlib-1.2.5.tar.gz ./zlib-1.2.5/* #压缩 tar  -czvf   ***.tar.gz tar  -cjvf   ***.tar.bz2

【转】C#打包文件夹成zip格式

原文地址 C#打包文件夹成zip格式(包括文件夹和子文件夹下的所有文件)C#打包zip文件可以调用现成的第三方dll,事半功倍,而且该dll完全免费,下载地址:SharpZipLib下载完解压缩后,把 ICSharpCode.SharpZipLib.dll 拷贝到当前项目的目录下(如果偷懒的话,可以直接拷贝到当前项目的bin\Debug目录下),在VS打开的项目引用上右键添加引用 ICSharpCode.SharpZipLib.dll然后,在VS打开的项目上右键新建一个类,命名为 ZipHelp

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

1.把文件下载到本地,放在在Apache环境下2.d.xlsx是某游戏的服务器名和玩家列表,本程序只适合此种xlsx文件结构,其他结构请修改index.php源码3.访问zip.php的功能是把生成的files文件夹打包成files.zip4.访问index.php即可生成files文件夹,里面0.js---n.js 分别存放各个服务器人名,server_name_list.js存放服务器列表.5.Classes 存放的是php读取excel的功能模块,具体任务逻辑都在index.php A.P

JSch - Java实现的SFTP(文件上传详解篇) 转

JSch是Java Secure Channel的缩写.JSch是一个SSH2的纯Java实现.它允许你连接到一个SSH服务器,并且可以使用端口转发,X11转发,文件传输等,当然你也可以集成它的功能到你自己的应用程序. 本文只介绍如何使用JSch实现的SFTP功能. SFTP是Secure File Transfer Protocol的缩写,安全文件传送协议.可以为传输文件提供一种安全的加密方法.SFTP 为 SSH的一部份,是一种传输文件到服务器的安全方式.SFTP是使用加密传输认证信息和传输

[转]C#压缩打包文件

/// <summary> /// 压缩和解压文件 /// </summary> public class ZipClass { /// <summary> /// 所有文件缓存 /// </summary> List<string> files = new List<string>(); /// <summary> /// 所有空目录缓存 /// </summary> List<string> p

C#压缩打包文件

该控件是使用csharp写的,因此可以直接在dotnet环境中引用,不需要注册. 利用 SharpZipLib方便地压缩和解压缩文件最新版本的SharpZipLib(0.84)增加了很多新的功能,其中包括增加了FastZip类,这让我们可以非常方便地把一个目录压缩成一个压缩包,经测试可以很好地支持文件中包含中文以及空格的情况. 压缩: /// <summary> /// 创建Zip对象 /// </summary> /// <param name="filename

谈论高并发(三十)解析java.util.concurrent各种组件(十二) 认识CyclicBarrier栅栏

这次谈话CyclicBarrier栅栏,如可以从它的名字可以看出,它是可重复使用. 它的功能和CountDownLatch类别似,也让一组线程等待,然后开始往下跑起来.但也有在两者之间有一些差别 1. 不同的对象等.CountDownLatch组线程等待的是一个事件.或者说是一个计数器归0的事件.而CyclicBarrier等待的对象是线程,仅仅有线程都到齐了才往下运行 2. 使用方式不同,这个也是由等待的对象不同引起的,CountDownLatch须要调用await()来让线程等待.调用cou

聊聊高并发(三十)解析java.util.concurrent各个组件(十二) 理解CyclicBarrier栅栏

这篇讲讲CyclicBarrier栅栏,从它的名字可以看出,它是可循环使用的.它的功能和CountDownLatch类似,也是让一组线程等待,然后一起开始往下执行.但是两者还是有几个区别 1. 等待的对象不同.CountDownLatch的一组线程等待的是一个事件,或者说是一个计数器归0的事件.而CyclicBarrier等待的对象是线程,只有线程都到齐了才往下执行 2. 使用方式不同,这个也是由等待的对象不同引起的,CountDownLatch需要调用await()来让线程等待,调用count