java-a实现压缩与解压缩(zip、gzip)

zip扮演着归档和压缩两个角色;gzip并不将文件归档,仅只是对单个文件进行压缩,所以,在UNIX平台上,命令tar通常用来创建一个档案文件,然后命令gzip来将档案文件压缩。

Java I/O类库还收录了一些能读写压缩格式流的类。要想提供压缩功能,只要把它们包在已有的I/O类的外面就行了。这些类不是Reader和Writer,而是InputStream和OutStreamput的子类。这是因为压缩算法是针对byte而不是字符的。

需要注意的是:java自带的工具类在windows压缩处理编码无法处理中文,所以不建议使用jre

相关类与接口:

Checksum 接口:被类Adler32和CRC32实现的接口
Adler32 :使用Alder32算法来计算Checksum数目
CRC32 :使用CRC32算法来计算Checksum数目

CheckedInputStream :InputStream派生类,可得到输入流的校验和Checksum,用于校验数据的完整性
CheckedOutputStream :OutputStream派生类,可得到输出流的校验和Checksum, 用于校验数据的完整性

DeflaterOutputStream :压缩类的基类。
ZipOutputStream :DeflaterOutputStream的一个子类,把数据压缩成Zip文件格式。
GZIPOutputStream :DeflaterOutputStream的一个子类,把数据压缩成GZip文件格式

InflaterInputStream :解压缩类的基类
ZipInputStream :InflaterInputStream的一个子类,能解压缩Zip格式的数据
GZIPInputStream :InflaterInputStream的一个子类,能解压缩Zip格式的数据

ZipEntry 类:表示 ZIP 文件条目
ZipFile 类:此类用于从 ZIP 文件读取条目

压缩类的用法非常简单;只要用GZIPOutputStream 或ZipOutputStream把输出流包起来,再用GZIPInputStream 或ZipInputStream把输入流包起来就行了。剩下的都是些普通的I/O操作。

测试

package com.jre.util.zip;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;

import com.jre.io.UtilsIoJre;

/**
 * zip文件处理(压缩处理时通过windows系统压缩的由于编码不是utf8的所以将导致中文抛出异常的情况)
 * @author huage
 *
 */
public class UtilsZipJre {

    public static void main(String[] args) {
        zipFileExtract("C:\\Users\\huage\\Desktop\\test\\111\\111.zip","C:\\Users\\huage\\Desktop\\test\\test");
        //zipDecompressingExtract("C:\\Users\\huage\\Desktop\\test\\111\\111.zip","C:\\Users\\huage\\Desktop\\test\\test");
        //zipCompressingExtract("C:\\Users\\huage\\Desktop\\test\\111\\test.zip",new File("C:\\Users\\huage\\Desktop\\test\\test"));

    }

    /**
     * 解压
     * @param path
     * @param pathExtract
     */
    public static void zipFileExtract(String path, String pathExtract){
        ZipFile zipfile = null;
        try {
            zipfile = new ZipFile(path);
            Enumeration<ZipEntry> entries = (Enumeration<ZipEntry>)zipfile.entries();
            if( entries!=null ){
                ZipEntry entry ;
                File file;
                BufferedInputStream bis = null;
                while( entries.hasMoreElements()){
                    entry = entries.nextElement();
                    if(entry.isDirectory())continue;
                    file=new File(pathExtract,entry.getName());
                    if(!file.exists()){
                        (new File(file.getParent())).mkdirs();
                    }
                    UtilsIoJre.converWriteIO(bis, file);
                    //System.out.println(fout+"解压成功");
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        } finally{
            UtilsIoJre.closeIO(zipfile);
        }

    }

    /**
     * zip解压(本地)(官方自带zip解压无法处理中文)
     *
     * @param path
     *            :zip文件地址
     * @param pathExtract
     *            :解压地址
     */
    public static void zipDecompressingExtract(String path, String pathExtract) {
        ZipInputStream zipinput = null;
        BufferedInputStream bininput = null;
        try {
            zipinput = new ZipInputStream(new FileInputStream(path));
            bininput = new BufferedInputStream(zipinput);

            ZipEntry entry ;
            File fout = null;
            while ((entry = zipinput.getNextEntry()) != null) {
                if(entry.isDirectory())continue;
                fout=new File(pathExtract,entry.getName());
                if(!fout.exists()){
                    (new File(fout.getParent())).mkdirs();
                }
                UtilsIoJre.converWriteIO(bininput, fout);
                //System.out.println(fout+"解压成功");
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            UtilsIoJre.closeIO(bininput,zipinput);
        }
        System.out.println("解压完成");
    }

    /**
     * zip压缩(本地)
     *
     * @param zipFileName
     * @param inputFile
     * @throws Exception
     */
    public static void zipCompressingExtract(String zipFileName, File inputFile) {
        ZipOutputStream out = null;
        BufferedOutputStream bo = null;
        try {
            out = new ZipOutputStream(new FileOutputStream(zipFileName));
            bo = new BufferedOutputStream(out);
            zipCompressing(out, inputFile, bo);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            UtilsIoJre.closeIO(bo,out);
        }
        System.out.println("压缩完成");
    }

    /**
     * zip压缩
     *
     * @param out
     * @param file
     * @param base
     * @param bo
     * @throws Exception
     */
    private static void zipCompressing(ZipOutputStream out, File file, BufferedOutputStream bo) throws Exception {
        if (file.isDirectory()) {
            File[] fl = file.listFiles();
            if (fl.length == 0) {
                out.putNextEntry(new ZipEntry(file.getName()));
            }
            for (int i = 0; i < fl.length; i++) {
                zipCompressing(out, fl[i], bo);
            }
        } else {
            out.putNextEntry(new ZipEntry(file.getName() ));
            UtilsIoJre.converReadIO(bo, file);
        }
    }
}

package com.jre.io;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;

/**
 * io流处理
 * @author huage
 *
 */
public class UtilsIoJre {

    /**
     * 将file写入BufferedOutputStream中
     * @param bo
     * @param file
     * @throws Exception
     */
    public static void converReadIO(BufferedOutputStream bo,File file) throws Exception{
        FileInputStream in = new FileInputStream(file);
        BufferedInputStream bi = new BufferedInputStream(in);
        int b;
        while ((b = in.read()) != -1) {
            bo.write(b);
        }
        closeIO(bi,in);
        bo.flush();//清空缓存
    }

    /**
     * 将BufferedInputStream写入file中
     * @param bo
     * @param file
     * @throws Exception
     */
    public static void converWriteIO(BufferedInputStream bininput,File file) throws Exception{
        FileOutputStream out = new FileOutputStream(file);
        BufferedOutputStream bout = new BufferedOutputStream(out);
        int b;
        while ((b = bininput.read()) != -1) {
            bout.write(b);
        }
        closeIO(bout,out);
        bout.flush();//清空缓存
    }

    /**
     * 关闭io
     * @param cl
     */
    public static void closeIO(AutoCloseable... cl){
        if( cl == null || cl.length == 0 )return;
        for (AutoCloseable c : cl) {
            try {
                c.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}
时间: 2024-10-24 21:50:59

java-a实现压缩与解压缩(zip、gzip)的相关文章

Android解压缩ZIP / GZIP数据(基于InflaterInputStream实现)

在实际的项目代码使用过程中,发现如果用Java类库标准指定的GZIPInputStream读取压缩数据解压不能稳定工作,原因不明.反而使用InflaterInputStream可以替代GZIPInputStream稳定.正常工作,现在把基于InflaterInputStream的zip\gzip解压代码工具方法给出: public static byte[] decompress(byte[] compress) throws Exception { ByteArrayInputStream b

Java对byte数组压缩 解压缩 (zip,gzip,bzip2,jzlib)

import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream;import java.io.DataOutputStream;import java.io.IOException;import java.util.zip.GZIPInputStream;import java.util.zip.GZIPOutputStream;import java.util.zip.ZipEntry;import java.

java 版本压缩、解压缩zip

import java.io.*; import java.util.*; import java.util.zip.ZipOutputStream; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; public class FileMgr { public FileMgr() { } /** * 压缩文件 * @param srcfile File[] 需要压缩的文件列表 * @param zipfile File 压缩

Linux 压缩与解压缩工具gzip/gunzip

gzip会压缩原文件并将原文件删除 -d 解压缩选项 类似于gunzip -# 指定压缩比 默认是6 -c 将压缩内容输出到标准输出上,并保留原文件 出现了压缩文件,但是原文件没有了. 现在解压缩 解压缩完成后,压缩文件消失了. 上面这个例子是将原文件压缩后的字符输出到标准输出上 就是将压缩文件的字符重定向到其他文件 gunzip 就是对gzip的压缩文件进行解压缩 原文地址:http://blog.51cto.com/yueyue207/2085786

Java.util.zip 压缩与解压缩工具类

Java.util.zip 提供用于读写标准 ZIP 和 GZIP 文件格式的类. 还包括使用 DEFLATE 压缩算法(用于 ZIP 和 GZIP 文件格式)对数据进行压缩和解压缩的类. 依赖 Jdk 编写该工具类,不依赖任何第三方 jar,随用随取,实现功能大体如下: 1.目录级别递归压缩与解压缩 zip: 2.单文件压缩和解压缩 zip : import java.io.*; import java.util.zip.ZipEntry; import java.util.zip.ZipIn

linux zip命令 tar命令 【压缩、解压缩】参数列表:

linux zip命令参数列表: -a 将文件转成ASCII模式 -F 尝试修复损坏的压缩文件 -h 显示帮助界面 -m 将文件压缩之后,删除源文件 -n 特定字符串 不压缩具有特定字尾字符串的文件 -o 将压缩文件内的所有文件的最新变动时间设为压缩时候的时间 -q 安静模式,在压缩的时候不显示指令的执行过程 -r 将指定的目录下的所有子目录以及文件一起处理 -S 包含系统文件和隐含文件(S是大写) -t 日期 把压缩文件的最后修改日期设为指定的日期,日期格式为mmddyyyy 举例: 压缩目录

Java生成压缩文件(zip、rar 格式)

jar坐标: <dependency> <groupId>org.apache.ant</groupId> <artifactId>ant</artifactId> <version>1.10.5</version> </dependency> 话不多说,直接上代码 package com.demo.student.util; import org.apache.tools.zip.ZipEntry; impo

day 2 压缩与解压缩命令 扩展.md

常用压缩格式:.zip .gz .bz2 常用压缩格式: .tar.gz .tar.bz2 zip 压缩文件名 源文件 压缩文件 zip -r 压缩文件名 源目录 压缩目录 .zip格式解压缩 unzip压缩文件 解压缩.zip文件 .gz格式压缩 .gzip 源文件 压缩为.gz格式对压缩文件,源文件会消失 gzip -c 源文件 >压缩文件 压缩为.gz格式,源文件保留 例如:gzip -c abc > abc.gz gzip -r 目录 压缩目录下所有的子文件,但是不能压缩目录 .gz格

Java实现文件压缩与解压[zip格式,gzip格式]

Java实现ZIP的解压与压缩功能基本都是使用了Java的多肽和递归技术,可以对单个文件和任意级联文件夹进行压缩和解压,对于一些初学者来说是个很不错的实例. zip扮演着归档和压缩两个角色:gzip并不将文件归档,仅只是对单个文件进行压缩,所以,在UNIX平台上,命令tar通常用来创建一个档案文件,然后命令gzip来将档案文件压缩. Java I/O类库还收录了一些能读写压缩格式流的类.要想提供压缩功能,只要把它们包在已有的I/O类的外面就行了.这些类不是Reader和Writer,而是Inpu