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 文件的讀操作

 

友情鏈接

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM