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

  • 相关阅读:
    算法训练 P1103
    算法训练 表达式计算
    算法训练 表达式计算
    基础练习 时间转换
    基础练习 字符串对比
    Codeforces 527D Clique Problem
    Codeforces 527C Glass Carving
    Codeforces 527B Error Correct System
    Codeforces 527A Glass Carving
    Topcoder SRM 655 DIV1 250 CountryGroupHard
  • 原文地址:https://www.cnblogs.com/softidea/p/5308470.html
Copyright © 2011-2022 走看看