zlib是一種資料壓縮程式庫,它的設計目標是處理單純的資料(而不管資料的來源是什麼)。
gzip是一種檔案壓縮公用程式(或該壓縮公用程式產生的壓縮檔格式),它的設計目標是處理單個的檔案。gzip在壓縮檔中的資料時使用的就是zlib。為了儲存與檔案屬性有關的資訊,gzip需要在壓縮檔(*.gz)中儲存更多的頭資訊內容,而zlib不用考慮這一點。但gzip只適用於單個檔案,所以我們在UNIX/Linux上經常看到的壓縮包尾碼都是*.tar.gz或*.tgz,也就是先用tar把多個檔案打包成單個檔案,再用gzip壓縮的結果。
zip是適用於壓縮多個檔案的格式(相應的工具有PkZip和WinZip等),因此,zip檔案還要進一步包含檔案目錄結構的資訊,比gzip的頭資訊更多。但需要注意,zip格式可採用多種壓縮演算法,我們常見的zip檔案大多不是用zlib的演算法壓縮的,其壓縮資料的格式與gzip大不一樣。
Java SDK提供了對上述三種壓縮技術的支援:Inflater類和Deflater類直接用zlib庫對資料壓縮/解壓縮,GZIPInputStream類和GZIPOutputStream類提供了對gzip格式的支援,ZipFile、ZipInputStream、ZipOutputStream則用於處理zip格式的檔案。
所以,你應當根據你的具體需求,選擇不同的壓縮技術:如果只需要壓縮/解壓縮資料,你可以直接用zlib實現,如果需要產生gzip格式的檔案或解壓其他工具的壓縮結果,你就必須用gzip或zip等相關的類來處理了。
【DEFLATE】
DEFLATE 是同時使用了 LZ77 演算法與哈夫曼編碼的一個無損資料壓縮演算法。它最初是由 Phil Katz 為他的 PKZIP 歸檔工具第二版所定義的,後來定義在 RFC1951 規範中。
人們普遍認為 DEFLATE 不受任何專利所制約,並且在 LZW(GIF 檔案格式使用)相關的專利失效之前,這種格式除了在ZIP檔案格式中得到應用之外也在 gzip 壓縮檔以及 PNG 影像檔中得到了應用。
DEFLATE 壓縮與解壓的原始碼可以在自由、通用的壓縮庫 zlib 上找到。
更高壓縮率的 DEFLATE 是 7-zip 所實現的。AdvanceCOMP 也使用這種實現,它可以對 gzip、PNG、MNG 以及 ZIP 檔案進行壓縮從而得到比 zlib 更小的檔案大小。在 Ken Silverman 的 KZIP 與 PNGOUT 中使用了一種更加高效同時要求更多使用者輸入的 DEFLATE 程式。
【INFLATE】
inflate是GZip, PNG等廣泛使用的解壓演算法,linux也使用inflate對核心進行解壓.inflate的解壓演算法使用的第3種快速解壓法的一個子集,它不考慮LONG_CODE,同時把SAME_LENGTH合并到MEDIUM_CODE。而對於規則的SAME_LENGTH編碼,比如length和distance編碼,inflate則使用額外的base和extra表示。這是因為在構造一般的尋找表時,雖然對於SAME_LENGTH首碼可以不構造副表,但我們需要另外一個表格來儲存符號的順序,而這個表格的空間可能更大。但對於length和distance編碼,他們的順序是遞增的,所以無需額外的表格來儲存符號的順序。
inflate使用root表示上述的b,尋找表的資料結構為code.主表和副同時儲存在inflate_state結構中的大數組codes[ENOUGH]中.表的建構函式位於inftrees.c檔案的inflate_table中.
【7z】
7z 是一種新的壓縮格式,它擁有目前最高的壓縮比。
7z 已公開了結構編輯功能,所以它可以支援任何一種新的壓縮演算法。到目前為止,下列壓縮演算法已被整合到了 7z 中:
壓縮演算法 備忘 LZMA LZ77 改良和最佳化演算法後的最新版本 PPMD 基於 Dmitry Shkarin 之上的演算法 PPMdH 並加以最佳化 BCJ 32-位 x86 可執行檔轉換程式 BCJ2 32-位 x86 可執行檔轉換程式 BZip2 標準 BWT 演算法 Deflate 標準 LZ77-based 演算法