zoukankan      html  css  js  c++  java
  • java基础---->Zip压缩的使用(转)

      java中提供了对压缩格式的数据流的读写。它们封装到现成的IO 类中,以提供压缩功能。下面我们开始java中压缩文件的使用。

    目录导航:

    1. 关于压缩的简要说明
    2. GZIP压缩文件的使用
    3. ZIP压缩文件的使用
    4. GZIP与ZIP压缩的比较
    5. 友情链接

    关于压缩的简要说明

    一、 Java中有着压缩的类:

    • CheckedInputStream GetCheckSum()为任何InputStream 产生校验和(不仅是解压)
    • CheckedOutputStream GetCheckSum()为任何OutputStream 产生校验和(不仅是解压)
    • DeflaterOutputStream 用于压缩类的基础类
    • ZipOutputStream 一个DeflaterOutputStream,将数据压缩成Zip 文件格式
    • GZIPOutputStream 一个DeflaterOutputStream,将数据压缩成GZIP 文件格式
    • InflaterInputStream 用于解压类的基础类
    • ZipInputStream 一个DeflaterInputStream,解压用Zip 文件格式保存的数据
    • GZIPInputStream 一个DeflaterInputStream,解压用GZIP 文件格式保存的数据

    二、 压缩库的一些说明:

    • 压缩类库是按字节方式而不是字符方式处理的,它们属于InputStream和OutputStream继承层次结构的一部分

    三、 ZIP压缩的使用注意:

    • 对于要加入压缩档的每一个文件,都必须调用putNextEntry(),并将其传递给一个ZipEntry 对象。
    • ZipEntry 对象包含了一个功能全面的接口,利用它可以获取和设置Zip 文件内那个特定的Entry(入口)上能够接受的所有数据:名字、压缩后和压缩前的长度、日期、CRC 校验和、额外字段的数据、注释、压缩方法以及它是否一个目录入口等等。
    • 尽管CheckedInputStream 和CheckedOutputStream 同时提供了对Adler32 和CRC32 校验和的支持,但是ZipEntry 只支持CRC 的接口
    • 为解压文件,ZipInputStream 提供了一个getNextEntry()方法,能在有的前提下返回下一个ZipEntry
    • 可以用ZipFile 对象读取文件。该对象有一个entries()方法,可以为ZipEntry 返回一个Enumeration(枚举)。

    GZIP压缩文件的使用

    我们通过一个简单的程序用例来展开今天压缩类的使用讲解 ,程序结构如下

    一、 我们创建一个GzipCompress类,用于GZIP压缩类的测试:首先是压缩文件方法compress():

    复制代码
    // 压缩文件
    private static void compress() throws Exception {
        BufferedReader in = new BufferedReader(new FileReader(("compress/test.txt")));
        BufferedOutputStream out = new BufferedOutputStream(new GZIPOutputStream(new FileOutputStream("uncompress/test.gz")));
        int c;
        while ((c = in.read()) != -1) {
            out.write(c);
        }
        in.close();
        out.close();
    }
    复制代码

    二、 我们创建GZIP的解压缩方法:uncompress()

    复制代码
    // 解压缩文件
    private static void uncompress() throws Exception {
        BufferedReader in = new BufferedReader(
                new InputStreamReader(new GZIPInputStream(new FileInputStream("uncompress/test.gz"))));
        String str;
        while ((str = in.readLine()) != null) {
            System.out.println(str);
        }
        in.close();
    }
    复制代码

    三、 在Main方法运行,得到如下结果:

    • 控制台打印: Hello World.
    • 在uncompress文件夹下生成test.gz文件

    ZIP压缩文件的使用

    一、 我们创建一个ZipCompress类,用于GZIP压缩类的测试:首先是压缩文件方法compress():压缩huhx.png,test2.txt, test3.txt, test4.txt文件

    复制代码
    private final static String[] resources = new String[] { "huhx.png", "test2.txt", "test3.txt", "test4.txt" };
    
    // 压缩文件
    private static void compress() throws Exception {
        FileOutputStream f = new FileOutputStream("uncompress/test.zip");
        CheckedOutputStream csum = new CheckedOutputStream(f, new Adler32());
        ZipOutputStream zos = new ZipOutputStream(csum);
        BufferedOutputStream out = new BufferedOutputStream(zos);
        zos.setComment("A test of java zipping");
        ZipEntry entry = null;
    
        for (String resource : resources) {
            System.out.println("writing file: " + resource);
            BufferedReader in = new BufferedReader(new FileReader("compress/" + resource));
            entry = new ZipEntry(resource);
            entry.setComment(resource + " comments");
            zos.putNextEntry(entry);
            int c;
            while ((c = in.read()) != -1) {
                out.write(c);
            }
            in.close();
            out.flush();
        }
        out.close();
        System.out.println("checksum: " + csum.getChecksum().getValue());
    }
    复制代码

    二、 我们创建ZIP的解压缩方法:uncompress1()

    复制代码
    // 解压缩文件
    private static void uncompress1() throws Exception {
        FileInputStream fi = new FileInputStream("uncompress/test.zip");
        CheckedInputStream csum = new CheckedInputStream(fi, new Adler32());
        ZipInputStream in2 = new ZipInputStream(csum);
        BufferedInputStream bis = new BufferedInputStream(in2);
    
        ZipEntry ze;
        while ((ze = in2.getNextEntry()) != null) {
            System.out.println("reading file: " + ze.getName());
        }
        System.out.println("checksum: " + csum.getChecksum().getValue());
        bis.close();
    }
    复制代码

    三、 我们创建ZIP的解压缩另外一种方法:uncompress2()

    复制代码
    // 解压缩文件
    private static void uncompress2() throws Exception {
        ZipFile zf = new ZipFile("uncompress/test.zip");
        Enumeration<?> e = zf.entries();
        while (e.hasMoreElements()) {
            ZipEntry entry = (ZipEntry) e.nextElement();
            System.out.println("File: " + entry.getComment());
        }
        zf.close();
    }
    复制代码

    四、 运行compress()和uncompress1()方法,得到结果如下:

    五、 运行compress()和uncompress2()方法,得到结果如下:

    GZIP与ZIP压缩的比较

    • GZIP: 如果只有单个数据流需要压缩(而不是一系列不同的数据),那么它就可能是最适当选择。
    • ZIP: 它可以方便地保存多个文件。甚至有一个独立的类来简化对Zip 文件的读操作

    友情链接

    http://www.cnblogs.com/huhx/p/javaCompress.html

  • 相关阅读:
    计蒜客 跳跃游戏2
    计蒜客 跳跃游戏
    2018 计蒜之道-初赛 第一场 A-百度无人车
    poj 3625 (最小生成树算法)
    poj 3623(贪心)
    poj2386(dfs搜索水题)
    poj 2761 主席树的应用(查询区间第k小值)
    POJ 2456 编程技巧之------二分查找思想的巧妙应用
    POJ 1995(有关快速幂运算的一道水题)
    1441:【例题2】生日蛋糕
  • 原文地址:https://www.cnblogs.com/softidea/p/5308470.html
Copyright © 2011-2022 走看看