1. 程式人生 > >Java壓縮技術(一) ZLib

Java壓縮技術(一) ZLib

有關ZLib可參見官方主頁 http://www.zlib.net/
ZLib可以簡單的理解為壓縮/解壓縮演算法,它與ZIP、RAR等歸檔演算法有所不同,與bzip2比較接近。 

壓縮工具程式碼如下: 
Java程式碼  收藏程式碼
  1. /** 
  2.  * 2009-9-9 
  3.  */  
  4. package org.zlex.commons.io;  
  5. import java.io.ByteArrayOutputStream;  
  6. import java.io.IOException;  
  7. import java.io.InputStream;  
  8. import java.io.OutputStream;  
  9. import java.util.zip.Deflater;  
  10. import java.util.zip.DeflaterOutputStream;  
  11. import java.util.zip.Inflater;  
  12. import java.util.zip.InflaterInputStream;  
  13. /** 
  14.  * ZLib壓縮工具 
  15.  *  
  16.  * @author <a href="mailto:[email protected]">樑棟</a> 
  17.  * @version 1.0 
  18.  * @since 1.0 
  19.  */  
  20. public abstract class ZLibUtils {  
  21.     /** 
  22.      * 壓縮
     
  23.      *  
  24.      * @param data 
  25.      *            待壓縮資料 
  26.      * @return byte[] 壓縮後的資料 
  27.      */  
  28.     public static byte[] compress(byte[] data) {  
  29.         byte[] output = new byte[0];  
  30.         Deflater compresser = new Deflater();  
  31.         compresser.reset();  
  32.         compresser.setInput(data);  
  33.         compresser.finish();  
  34.         ByteArrayOutputStream bos = new ByteArrayOutputStream(data.length);  
  35.         try {  
  36.             byte[] buf = new byte[1024];  
  37.             while (!compresser.finished()) {  
  38.                 int i = compresser.deflate(buf);  
  39.                 bos.write(buf, 0, i);  
  40.             }  
  41.             output = bos.toByteArray();  
  42.         } catch (Exception e) {  
  43.             output = data;  
  44.             e.printStackTrace();  
  45.         } finally {  
  46.             try {  
  47.                 bos.close();  
  48.             } catch (IOException e) {  
  49.                 e.printStackTrace();  
  50.             }  
  51.         }  
  52.         compresser.end();  
  53.         return output;  
  54.     }  
  55.     /** 
  56.      * 壓縮 
  57.      *  
  58.      * @param data 
  59.      *            待壓縮資料 
  60.      *  
  61.      * @param os 
  62.      *            輸出流 
  63.      */  
  64.     public static void compress(byte[] data, OutputStream os) {  
  65.         DeflaterOutputStream dos = new DeflaterOutputStream(os);  
  66.         try {  
  67.             dos.write(data, 0, data.length);  
  68.             dos.finish();  
  69.             dos.flush();  
  70.         } catch (IOException e) {  
  71.             e.printStackTrace();  
  72.         }  
  73.     }  
  74.     /** 
  75.      * 解壓縮 
  76.      *  
  77.      * @param data 
  78.      *            待壓縮的資料 
  79.      * @return byte[] 解壓縮後的資料 
  80.      */  
  81.     public static byte[] decompress(byte[] data) {  
  82.         byte[] output = new byte[0];  
  83.         Inflater decompresser = new Inflater();  
  84.         decompresser.reset();  
  85.         decompresser.setInput(data);  
  86.         ByteArrayOutputStream o = new ByteArrayOutputStream(data.length);  
  87.         try {  
  88.             byte[] buf = new byte[1024];  
  89.             while (!decompresser.finished()) {  
  90.                 int i = decompresser.inflate(buf);  
  91.                 o.write(buf, 0, i);  
  92.             }  
  93.             output = o.toByteArray();  
  94.         } catch (Exception e) {  
  95.             output = data;  
  96.             e.printStackTrace();  
  97.         } finally {  
  98.             try {  
  99.                 o.close();  
  100.             } catch (IOException e) {  
  101.                 e.printStackTrace();  
  102.             }  
  103.         }  
  104.         decompresser.end();  
  105.         return output;  
  106.     }  
  107.     /** 
  108.      * 解壓縮 
  109.      *  
  110.      * @param is 
  111.      *            輸入流 
  112.      * @return byte[] 解壓縮後的資料 
  113.      */  
  114.     public static byte[] decompress(InputStream is) {  
  115.         InflaterInputStream iis = new InflaterInputStream(is);  
  116.         ByteArrayOutputStream o = new ByteArrayOutputStream(1024);  
  117.         try {  
  118.             int i = 1024;  
  119.             byte[] buf = new byte[i];  
  120.             while ((i = iis.read(buf, 0, i)) > 0) {  
  121.                 o.write(buf, 0, i);  
  122.             }  
  123.         } catch (IOException e) {  
  124.             e.printStackTrace();  
  125.         }  
  126.         return o.toByteArray();  
  127.     }  
  128. }  

測試用例程式碼如下: 
Java程式碼  收藏程式碼
  1. /** 
  2.  * 2009-9-9 
  3.  */  
  4. package org.zlex.commons.io;  
  5. import static org.junit.Assert.*;  
  6. import java.io.File;  
  7. import java.io.FileInputStream;  
  8. import java.io.FileOutputStream;  
  9. import org.junit.Test;  
  10. /** 
  11.  * ZLib壓縮測試用例 
  12.  *  
  13.  * @author <a href="mailto:[email protected]">樑棟</a> 
  14.  * @version 1.0 
  15.  * @since 1.0 
  16.  */  
  17. public class ZLibUtilsTest {  
  18.     @Test  
  19.     public final void testBytes() {  
  20.         System.err.println("位元組壓縮/解壓縮測試");  
  21.         String inputStr = "[email protected];[email protected];[email protected]";  
  22.         System.err.println("輸入字串:\t" + inputStr);  
  23.         byte[] input = inputStr.getBytes();  
  24.         System.err.println("輸入位元組長度:\t" + input.length);  
  25.         byte[] data = ZLibUtils.compress(input);  
  26.         System.err.println("壓縮後位元組長度:\t" + data.length);  
  27.         byte[] output = ZLibUtils.decompress(data);  
  28.         System.err.println("解壓縮後位元組長度:\t" + output.length);  
  29.         String outputStr = new String(output);  
  30.         System.err.println("輸出字串:\t" + outputStr);  
  31.         assertEquals(inputStr, outputStr);  
  32.     }  
  33.     @Test  
  34.     public final void testFile() {  
  35.         String filename = "zlib";  
  36.         File file = new File(filename);  
  37.         System.err.println("檔案壓縮/解壓縮測試");  
  38.         String inputStr = "[email protected];[email protected];[email protected]";  
  39.         System.err.println("輸入字串:\t" + inputStr);  
  40.         byte[] input = inputStr.getBytes();  
  41.         System.err.println("輸入位元組長度:\t" + input.length);  
  42.         try {  
  43.             FileOutputStream fos = new FileOutputStream(file);  
  44.             ZLibUtils.compress(input, fos);  
  45.             fos.close();  
  46.             System.err.println("壓縮後位元組長度:\t" + file.length());  
  47.         } catch (Exception e) {  
  48.             fail(e.getMessage());  
  49.         }  
  50.         byte[] output = null;  
  51.         try {  
  52.             FileInputStream fis = new FileInputStream(file);  
  53.             output = ZLibUtils.decompress(fis);  
  54.             fis.close();  
  55.         } catch (Exception e) {  
  56.             fail(e.getMessage());  
  57.         }  
  58.         System.err.println("解壓縮後位元組長度:\t" + output.length);  
  59.         String outputStr = new String(output);  
  60.         System.err.println("輸出字串:\t" + outputStr);  
  61.         assertEquals(inputStr, outputStr);  
  62.     }  
  63. }  

輸入結果 
Consloe程式碼  收藏程式碼
  1. 位元組壓縮/解壓縮測試  
  2. 輸入字串:  [email protected];[email protected];[email protected]  
  3. 輸入位元組長度: 59  
  4. 壓縮後位元組長度:    39  
  5. 相關推薦

    Java壓縮技術 ZLib

    有關ZLib可參見官方主頁 http://www.zlib.net/ZLib可以簡單的理解為壓縮/解壓縮演算法,它與ZIP、RAR等歸檔演算法有所不同,與bzip2比較接近。 壓縮工具程式碼如下:  Java程式碼   /**   * 2009-9-9   */  

    Java加密技術——BASE64與單向加密算法MD5&SHA&MAC

    sha256 integer 被人 sent 發現 Coding design 如果 targe http://snowolf.iteye.com/blog/379860 加密解密,曾經是我一個畢業設計的重要組件。在工作了多年以後回想當時那個加密、解密算法,實在是太單

    淺談存儲重刪壓縮技術

    emc 將他 壓力測試 處理方式 比對 公眾號 center str 今天 淺談重刪壓縮技術(一) <喜歡更多內容可以關註微信公眾號“圍爐煮酒論IT”>作為一個做企業存儲市場的存儲人,最近兩年我不斷被重刪壓縮撩撥著。對於重刪壓縮這個技術的好壞,真實需求還是偽需求

    Java壓縮技術 ZIP壓縮——Java原生實現

    查過相關資料後才知道,ZIP應該算作歸檔類的壓縮演算法,每一門學科都可深可淺!閒言少敘,先說ZIP壓縮。 zip壓縮需要通過ZipOutputStream 執行write方法將壓縮資料寫到指定輸出流中。 注意,這裡應先使用CheckedOutputStream 指定檔案校驗

    10.1-全棧Java筆記:最全面的IO技術

    javaIO技術對於任何程序設計語言而言,輸入輸出(Input/Output)系統都是非常核心的功能。程序運行需要數據,數據的獲取往往需要跟外部系統進行通信,外部系統可能是文件、數據庫、其他程序、網絡、IO設備等等。外部系統比較復雜多變,那麽我們有必要通過某種手段進行抽象、屏蔽外部的差異,從而實現更加便捷的編

    PDF技術-Java實現Office系列檔案轉PDF檔案

    最近,公司要求做個檔案轉pdf的調研報告,於是在網上找了一些實現方法,現在將這些方法做個對比,並記錄下來,以後或許有用呢,哈哈。 首先說一下需求,產品要求不能使用第三方軟體實現,因為這種實現方式效率不高,所以需要使用“純Java程式碼”實現。同時也對跨平臺有要求,系統需要執行在linux系統

    JAVA爬蟲---驗證碼識別技術

            Python中有專門的影象處理技術比如說PIL,可以對驗證碼一類的圖片進行二值化處理,然後對圖片進行分割,進行畫素點比較得到圖片中的數字。這種方案對驗證碼的處理相對較少,運用相對普遍,很多驗證碼圖片可以通過這個方式得到識別,當然還需要一部分的降

    JAVA秒會技術之玩轉SQL】MySQL優化技術

    MySQL優化技術(一)         開發的路上,總會碰到一些老系統,越用越慢。“慢”的原因也許有很多,但是,博主個人覺得,資料庫的設計和sql語句寫的好壞,對系統效率的影響是最直接,最顯而易見的!所以,學習一下MySQL的優化,還是很有必要的。當然,博主能力有限,沒那

    [Java 多執行緒技術]執行緒和程序以及並行和併發的概念

    程序與執行緒 1、 程序(Process)是計算機中的程式關於某資料集合上的一次執行活動,是系統進行資源分配和排程的基本單位,是作業系統結構的基礎。在早期面向程序設計的計算機結構中,程序是程式的基本執行實體;在當代面向執行緒設計的計算機結構中,程序是執行緒的容

    JAVA技術——位元組碼&反射

    Reflection-反射是J2SE1.1就已經提出了,但當時僅支援Introspection自省。在1.2之後開始逐漸成熟,spirng、hibernate等成熟框架都大量使用java反射技術實現。在面向物件設計思想中,使用類這一概念表述一類具有相同屬性的物件;而這些屬性值

    java】簡介

    編碼 http ... 設計 適合 不能 高度 代碼格式 操作系統 應用:web後端開發、android-app開發、大數據應用開發 學習:java會過時,但程序設計的思想不會過時 特點:1、面向對象,跨平臺,語法比c++簡單     2、以字節碼的形式運行在虛擬機上   

    Java小故事

    時間 abs 十年 caption out 創建 long ger i++ 1 import java.util.Date; //導入包 2 public class Test11 { 3

    【問底】夏俊:深入站點服務端技術——站點並發的問題

    而是 思路 臨時 系統負載 表現 json article 不能 情況 摘要:本文來自擁有十年IT從業經驗、擅長站點架構設計、Web前端技術以及Java企業級開發的夏俊,此文也是《關於大型站點技術演進的思考》系列文章的最新出爐內容。首發於CSDN,各位技術人員不

    Java加密技術——數字證書

    keystore 表示 encode png 代碼 簽名 更新 rsa加密 turn 原文:http://snowolf.iteye.com/blog/391931 請大家在閱讀本篇內容時先閱讀 Java加密技術(四),預先了解RSA加密算法。 在構建Java代碼實現前

    Java語法糖

    級別 類型擦除 簽名 轉換 uga pre 它的 out fde 概述   語法糖(Syntactic Sugar):主要作用是提高編碼效率,減少編碼出錯的機會。   解語法糖發生在Java源碼被編譯成Class字節碼的過程中,還原回簡單的基礎語法結構。 語法糖之一:泛型(

    java基礎——Servlet

    .get protected pre exc 規範 直接下載 程序 新建 路徑 一.Servlet簡介 Servlet(Server Applet)是Java Servlet的簡稱,稱為小服務程序或服務連接器,用Java編寫的服務器端程序,主要功能在於交互式地瀏覽和修改數據

    JAVA學習總結

    產生 java虛擬機 右鍵 分布式系 jdk 問題 功能 地址 輸出 一、Java是什麽? Java 是由 Sun Microsystems 在 1995 年首先發布的編程語言和計算平臺。Java 是一項用於開發應用程序的技術,可以讓 Web 變得更有意思和更實用。有許多應

    Java學習筆記

    fun 編程語言 java 初始化 創建 abs 就是 p s 屬性 1.1. 一個數取反的算法 a取反,~a=-(a+1)。如 ~5=-6,~(-8)=7 1.2. Java中類的訪問控制符 (類的修飾符有public、default、abstract、final,方法的

    JAVA枚舉引入枚舉知識點的前戲

    java枚舉/* 例子:定義一個員工類Employees,使用一個變量restday來表示他哪一天休息 */ //-------------------------------version:0.1---------------------- /* class Employees { privat

    java枚舉:即對java枚舉中的例子進行拓展

    枚舉/* 知識點:枚舉 枚舉是從java5開始提供的一種新的數據類型,是一個特殊的類,就是多個常量對象的集合 定義格式: [修飾符] enum 枚舉類名 { 常量A, 常量B, 常量C; } */ //定義枚舉 enum Weekday { Mond